胡子哥哥
考虑一个添加前N个整数的简单函数。(例如sum(5) = 1 + 2 + 3 + 4 + 5 = 15)。这是一个使用递归的简单JavaScript实现:function recsum(x) {
if (x===1) {
return x;
} else {
return x + recsum(x-1);
}}如果你打电话recsum(5),这就是JavaScript解释器会评估的内容:recsum(5)5 + recsum(4)5 + (4 + recsum(3))5 + (4 + (3 + recsum(2)))5 + (4 + (3 + (2 + recsum(1))))5 + (4 + (3 + (2 + 1)))15请注意每个递归调用必须在JavaScript解释器开始实际执行计算总和之前完成。这是同一函数的尾递归版本:function tailrecsum(x, running_total=0) {
if (x===0) {
return running_total;
} else {
return tailrecsum(x-1, running_total+x);
}}这是您调用时将发生的事件序列tailrecsum(5)(tailrecsum(5, 0)由于默认的第二个参数,这将是有效的)。tailrecsum(5, 0)tailrecsum(4, 5)tailrecsum(3, 9)tailrecsum(2, 12)tailrecsum(1, 14)tailrecsum(0, 15)15在尾递归的情况下,每次递归调用的评估running_total都会更新。注意:原始答案使用了Python中的示例。这些已经改为JavaScript,因为现代JavaScript解释器支持尾调用优化,但Python解释器不支持。