我看到以下这个 F# 的 continuation-passing-style 斐波那契函数定义,我一直认为它是尾递归的:
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,并被告知递归调用不在尾部位置。
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#的等价,那么为什么这个函数不是尾递归呢?