【发布时间】:2015-03-29 18:36:31
【问题描述】:
考虑以下递归幂法乘法:
import scala.annotation.tailrec
@tailrec def mult(x: Double, n:Int) : Double = {
n match {
case 0 => 1
case 1 => x
case _ if ((n & 0x01) != 0) => x * mult(x*x, (n-1)/2)
case _ => mult(x*x, n/2)
}
}
编译错误为:
<console>:28: error: could not optimize @tailrec annotated method mult:
it contains a recursive call not in tail position
y * mult(x*x,(n-2)/2)
^
所以 .. 鉴于递归调用 是 最后一个条目 - 我认为产品 y *(尾递归子句)存在问题?如何正确构建它?
更新
这是已接受答案的修改版本 - 我很懒,只是在被调用的方法中放置了第三个累加器。
@tailrec def mult(x: Double, n:Int, accum: Double = 1.0) : Double = {
n match {
case 0 => accum
case 1 => accum * x
case _ if ((n & 0x01) != 0) => mult(x*x, (n-1)/2, x * accum)
case _ => mult(x*x, n/2, accum)
}
}
mult: (x: Double, n: Int, accum: Double)Double
试试看:
scala> mult(2, 7)
res0: Double = 128.0
scala> mult(2, 8)
res1: Double = 256.0
【问题讨论】:
标签: scala tail-recursion