在js函数式编程中由一个尾递归的问题。http://es6.ruanyifeng.com/#do...尾调用优化
function fibonacciTail(n, a = 0, b = 1) {
if (n === 0) return a
return fibonacciTail(n - 1, b, a + b)
}
可以是实现尾递归优化的一个典型例子,在这里,每次调用后递归传入 fibonacciTail 函数的 n 会依次递减 1,它实际上是用来记录递归剩余的次数。而 a 和 b 两个参数在每次递归时也会在计算后再次传入 fibonacciTail 函数,写成调用栈的形式就很清楚了:
fibonacciTail(5) === fibonacciTail(5, 0, 1)
fibonacciTail(4, 1, 1)
fibonacciTail(3, 1, 2)
fibonacciTail(2, 2, 3)
fibonacciTail(1, 3, 5)
fibonacciTail(0, 5, 8) => return 5
可以看到,每次递归都不会增加调用栈的长度,只是更新当前的堆栈帧而已。也就避免了内存的浪费和爆栈的危险。(以上是摘抄的)
同样类似的一个例子
function sum(x, y) {
if (y > 0) {
return sum(x + 1, y - 1);
} else {
return x;
}
}
sum(1, 100000)
为什么会爆栈呢?为什么不可以类推成
sum(1,10000)
sum(2,9999)
sum(3,9998)
...
sum(10000,1)
sum(10001,0) =>return 10001
这个函数内部函数并未引用外层函数的内部变量,两个变量x,y均为引用外部变量。 问题的关键难道是 return x
返回的不是一个尾调函数么?
我来回答下当初自己提的这个问题,上次参加杭州 node party的时候, 贺老讲了stc-vs-ptc.总的来说,尾归调用的想法是好的,但是落地的时候出现了分歧,node在后续的版本中支持过尾归调用,但后续给去掉了。浏览器上只有safari支持,而其他浏览器上并不支持。所以,这是一个“未真正实现的提议”,大家仅仅了解下,目前还无法普遍用到生产环境中。