11

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

我不是在问为什么尾递归比简单递归更好,我认为在任何地方都清楚地解释了它。

所以为什么

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
4

2 回答 2

9

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

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

在这里进一步阅读

于 2012-10-16T02:45:07.173 回答
-1

递归消耗更多的内存(堆栈帧的开销)和更多的 CPU 周期(创建和销毁堆栈帧的开销)。然而,它使代码更具可读性。迭代降低了代码的可读性,但释放了更多的内存和 CPU,因此受限环境可能需要它,例如 IOT 设备、电话等。有关详细说明,请参见此处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

于 2020-06-29T16:43:26.983 回答