[英]Different result for for-loop, while-loop and recursive method in a same file?
我通过for循环,while循环和递归方法计算了斐波那契数列。 我在一个文件中通过这 3 种方式进行了计算。 我像往常一样从 for 循环和 while 循环中得到结果。 但是当我添加recusive方法代码时,我得到的结果如下:
代码:
// Calulating fibonacci series using for loop
function fibonacci(n) {
var fibo = [0, 1];
for (var i = 2; i <= n; i++) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
}
return (fibo);
}
var result = fibonacci(7);
console.log(result)
// Calculating fibonacci series using while loop
function fibonacci(n) {
var fibo = [0, 1];
var i = 2;
while (i <= n) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
i++;
}
return fibo;
}
var result = fibonacci(7);
console.log(result);
// Calculating fibonacci series in a recursive way
function fibonacci(n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
var result = fibonacci(7);
console.log(result);
结果:
$ node fibonacci.js
13
13
13
看到我的递归方法的结果也显示了 for 循环和 while 循环。 当我注释掉递归方法代码时,结果显示:
$ node fibonacci.js
[
0, 1, 1, 2,
3, 5, 8, 13
]
[
0, 1, 1, 2,
3, 5, 8, 13
]
正如预期的那样。 为什么会这样??? 这似乎很神秘,因为我对递归知之甚少。
function fibonacci(n) {
var fibo = [0, 1];
for (var i = 2; i <= n; i++) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
}
return fibo[fibo.length - 1];
}
var result = fibonacci(7);
console.log(result)
如果你在chrome 开发工具中运行这个例子,你会看到结果总是数组。 因为在 for 循环中你正在填充数组,所以递归方法没有错。
fibo[i]
您每次都在向数组中添加新元素。 尝试使用fibo[fibo.length - 1]
,您将获得计算的最后一个元素
与while循环相同。 你是一个填充数组。 如果您的目标是获得最后一个值,而不是整个计算列表,那么递归变体是唯一正确的。
他们都使用相同的名称“fibonacci”并覆盖fibonacci
的定义。 只有最后一个 function 声明正在执行。 使用不同的名称。
(函数声明连同它们的定义一起被提升。)
由于吊装,OP代码相当于:
var fibonacci = function fibonacci(n) { ...(forloop) }
var fibonacci = function fibonacci(n) { ...(while) }
var fibonacci = function fibonacci(n) { ...(recursive) }
var result = fibonacci(7);
console.log(result);
var result = fibonacci(7);
console.log(result);
var result = fibonacci(7);
console.log(result);
只需重命名它们,以免它们发生冲突。
还添加了一个递归 fib4 实现,它返回一个斐波那契值数组。
// Calulating fibonacci series using for loop function fibonacci1(n) { var fibo = [0, 1]; for (var i = 2; i <= n; i++) { fibo[i] = fibo[i - 1] + fibo[i - 2]; } return (fibo); } var result = fibonacci1(7); console.log(result) // Calculating fibonacci series using while loop function fibonacci2(n) { var fibo = [0, 1]; var i = 2; while (i <= n) { fibo[i] = fibo[i - 1] + fibo[i - 2]; i++; } return fibo; } var result = fibonacci2(7); console.log(result); // Calculating fibonacci series in a recursive way function fibonacci3(n) { if (n == 0) { return 0; } if (n == 1) { return 1; } else { return fibonacci3(n - 1) + fibonacci3(n - 2); } } var result = fibonacci3(7); console.log(result); // recursive with cache table 2nd parameter, returns cache table const fib4 = (n, fib=[0,1]) => { fib[n] = fib[n]?? (fib4(n-1, fib)[n-1] + fib4(n-2, fib)[n-2]) return fib } var result = fib4(7); console.log(result);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.