繁体   English   中英

同一文件中的for循环,while循环和递归方法的结果不同?

[英]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);

MDN 关于吊装的文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM