我正在学习斐波纳契函数,其中一个答案如下:
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。
答案 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-1
,i--
和--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