关于尾递归优化的问题

在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 函数,写成调用栈的形式就很清楚了:

https://img3.mukewang.com/5bf654060001424803100105.jpg

可以看到,每次递归都不会增加调用栈的长度,只是更新当前的堆栈帧而已。也就避免了内存的浪费和爆栈的危险。(以上是摘抄的)
同样类似的一个例子

function sum(x, y) {

  if (y > 0) {

    return sum(x + 1, y - 1);

  } else {

    return x;

  }

}


sum(1, 100000)

为什么会爆栈呢?为什么不可以类推成

https://img3.mukewang.com/5bf6541b0001364502280102.jpg

这个函数内部函数并未引用外层函数的内部变量,两个变量x,y均为引用外部变量。 问题的关键难道是 return x返回的不是一个尾调函数么?

www说
浏览 651回答 0
0回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript