Javascript i++递归过多,i+1尾递归ok

Javascript i++ too much recursion, i+1 ok in 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))

由于arguments.callee在ES5之后在严格模式下是被禁止的,所以我用一个函数名来代替。之后,我看到了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))

经过几次debug,我发现i+1可以正常工作,而i++却不行。

那么,是我用错了地方还是我根本没理解i++?

再次感谢。

i++ 递增一个数字,returns 旧值.

这实际上意味着您在任何地方都传递 i 而不是 i + 1

最好只传递 i + 1,因为这是您要求的值 - 但 ++i 也可以。

i+1 表示 "return value that is one larger than i, don't change i"

i++ 表示 "increment i by one, but return the original value"

++i表示"increment i by one and return the incremented value"

所以在这种情况下,如果您使用 i+1,您并没有更改 i 的值,而是发送了一个比 [=31] 大的值=]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

同样适用于i-1i----i

这是因为只有i++的输出与i + 1相同。

但是当您使用 i++ 时,您也将值分配给了 i

所以

var i = 0;
output i++; // 1
output i; // still 1

var i = 0;
output i + 1; // 1
output i; // 0