让我举例说明我的问题。这是在 Scala 中用尾递归编写的标准求幂算法:
def power(x: Double, y: Int): Double = {
def sqr(z: Double): Double = z * z
def loop(xx: Double, yy: Int): Double =
if (yy == 0) xx
else if (yy % 2 == 0) sqr(loop(xx, yy / 2))
else loop(xx * x, yy - 1)
loop(1.0, y)
}
这里sqr
方法用于产生loop
' 结果的平方。这看起来不是一个好主意——为这样一个简单的操作定义一个特殊的函数。但是,我们不能只写loop(..) * loop(..)
,因为它会使计算加倍。
我们也可以用函数val
和不sqr
函数来编写它:
def power(x: Double, y: Int): Double = {
def loop(xx: Double, yy: Int): Double =
if (yy == 0) xx
else if (yy % 2 == 0) { val s = loop(xx, yy / 2); s * s }
else loop(xx * x, yy - 1)
loop(1.0, y)
}
我不能说它看起来比变体更好sqr
,因为它使用state variable
. 第一种情况更实用,第二种方式对 Scala 更友好。
无论如何,我的问题是如何处理需要对函数结果进行后处理的情况?也许 Scala 有其他方法可以实现这一目标?