尾递归与迭代算法

时间:2012-10-15 09:49:56

标签: recursion tail-recursion iteration

我找不到描述为什么尾递归函数应优先于迭代算法的文章。

我不是在问为什么尾递归比简单的递归更好,我认为这在任何地方都有明确的解释。

为什么

sum(n) = {
    def sumImpl(n, acc) = if(n <= 0) acc  else sumImpl(n - 1 , n + accumulator)
    sumImpl(n, 0)
}

优于

sum = 0;
while(n--) sum += n

2 个答案:

答案 0 :(得分:6)

递归使程序更具可读性,但性能较差。迭代过程提供了良好的性能,但不具有可读性,并且可能需要局部变量来存储中间值(可变性)。使用尾递归,您将获得两全其美,并且不需要“求和”变量(不变性)。这在计算大数和或因子时非常有用,因为您只需将结果转发到下一个递归函数调用就不会得到堆栈溢出异常。

在并行环境中,不变性非常重要。尝试编辑代码并将非常大的数字传递给函数以查看差异。

进一步阅读here

答案 1 :(得分:0)

递归消耗更多的内存(堆栈帧的开销)和更多的cpu周期(创建和销毁堆栈帧的开销)。但是,它使代码更具可读性。迭代使代码的可读性降低,但释放了更多的内存和cpu,因此对于受约束的环境(例如物联网设备,电话等。有关详细说明,请参见此处https://www.ocf.berkeley.edu/~shidi/cs61a/wiki/Iteration_vs._recursion#:~:text=Iteration%20and%20recursion%20are%20both%20ways%20to%20achieve%20repetition%20in%20programs.&text=All%20iterative%20functions%20can%20be,is%20defined%20as%20tail%20recursion