我已经看到了以下 F# 对连续传递式斐波那契函数的定义,我一直认为它是尾递归的:
let fib k =
let rec fib' k cont =
match k with
| 0 | 1 -> cont 1
| k -> fib' (k-1) (fun a -> fib' (k-2) (fun b -> cont (a+b)))
fib' k id
在 Scala 中尝试等效代码时,我使用了现有的 @tailrec,当 Scala 编译器通知我递归调用不在尾部位置时,我措手不及:
def fib(k: Int): Int = {
@tailrec def go(k: Int, cont: Int => Int): Int = {
if (k == 0 || k == 1) cont(1)
else go(k-1, { a => go(k-2, { b => cont(a+b) })})
}
go(k, { x => x })
}
我相信我的 Scala 实现等同于 F#,所以我想知道为什么该函数不是尾递归的?