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

时间:2015-04-17 07:39:22

标签: 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))

由于在ES5之后在strict模式下禁止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))

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

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

Thnx。

3 个答案:

答案 0 :(得分:10)

i++增加一个数字,返回旧值

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

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

答案 1 :(得分:6)

i+1表示&#34;返回值大于 i 的值,不要更改 i &#34;

i++表示&#34;将 i 增加1,但返回原始值&#34;

++i表示&#34;将 i 递增1并返回递增的值&#34;

因此,在这种情况下,如果您使用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

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

答案 2 :(得分:4)

这是因为只有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