我正在尝试实现一个计算2的幂的尾递归函数:
let rec po2 x =
match x with
| 1 -> 1I
| _ -> po2 (x-1) * 2I
这有点像预期,但由于我将递归调用的结果乘以2,因此这段代码不是尾递归的。
关于如何使这个尾部递归的任何想法?
答案 0 :(得分:4)
通过使用"累加器"可以将任何线性递归函数转换为尾递归函数。 - 一个穿透参数,累积到目前为止计算的""值。一般情况下,您要为堆内存交换堆栈内存(需要存储"到目前为止"值某处),但在某些情况下,您可以通过不存储来节省整个"到目前为止"价值,但只是其中的一部分。在你的情况下,你真正需要存储的是最后一次乘法的结果,而不是乘法的整个历史:
let rec po2Cached acc x =
match x with
| 0 -> acc
| x -> po2Cached (acc*2l) (x-1)
(为简单起见,我省略了记忆部分)
P.S。请注意,此功能会对负功率产生错误的结果。