在以下函数中,我尝试通过使用累加器来设置尾递归。但是,我遇到了堆栈溢出异常,这让我相信我设置函数的方式没有正确启用尾递归。
//F# attempting to make a tail recursive call via accumulator
let rec calc acc startNum =
match startNum with
| d when d = 1 -> List.rev (d::acc)
| e when e%2 = 0 -> calc (e::acc) (e/2)
| _ -> calc (startNum::acc) (startNum * 3 + 1)
我的理解是,使用acc
编译器可以让编译器看到没有必要为每个递归调用保留所有堆栈帧,因为它可以将每次传递的结果填充到 acc 并从每个帧返回。显然,我不明白如何正确使用累加器值,因此编译器会进行尾调用。