Javascript i ++过多递归,i + 1尾递归确定

Fad*_*aos 6 javascript recursion tail-recursion

谢谢你的时间.

我正在学习斐波那契函数,其中一个答案如下:

function fibonacci(n) {
    return (function(a, b, i) {
        return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
    })(1, 1, 1);
}
console.log(fibonacci(51))
Run Code Online (Sandbox Code Playgroud)

由于在ES5之后严格模式中禁止arguments.callee,所以我用函数名替换它.之后,我看到了i + 1部分,我用i ++替换它,结果是太多的递归.

function x(n){
    return (function y(a, b, i){
        return (i < n) ? y(b, a + b, i++) : a;
    })(1,1,1)
}
console.log(x(51))
Run Code Online (Sandbox Code Playgroud)

经过几次调试后,我发现i + 1工作正常,而i ++没有.

那么,我使用i ++是错误的地方还是我根本不了解i ++?

Thnx再次.

Ben*_*aum 10

i++递增一个数字并返回旧值.

这实际上意味着你要i到处传递而不是i + 1.

最好只是通过,i + 1因为这是你要求的价值 - 但++i也会有效.

  • @greenhoorn:你*可以*,但它没有任何意义.`i`后来没有在同一个电话中使用,所以回写它没有意义. (2认同)

Sam*_*nen 6

i+1意思是"返回值比大1 ,不要改变 "

i++表示"将i递增1,但返回原始值"

++i表示"将i递增1并返回递增的值"

因此,在这种情况下,如果您使用的i+1是不更改i的值,但是您发送的值比i大一个作为参数.您也可以使用++i,如果您需要i中的值也可以更改.

例子

i = 10
a = i+1
// a = 11, i = 10

i = 10
a = i++
// a = 10, i = 11

i = 10
a = ++i
// a = 11, i = 11
Run Code Online (Sandbox Code Playgroud)

这同样也适用于i-1,i----i