Javascript 斐波那契递归

标签 javascript recursion

请参阅下面的代码-

function fib(x) {
    if (x === 0) {
        return 0;
    } else if (x === 1) {
        return 1;
    } else {
        return fib(x-1) + fib(x-2);
    }
}

我有 2 个问题,关于递归的基本问题。

1)当递归调用fib()时,它不是会像n取值0、-1、-2一样无限地进行下去……既然上面的代码有效,那么停止条件是什么呢?

2) 如果我们从上面的代码中删除 if() 或 else if() 条件,则会出现最大堆栈大小错误。 if 或 else if 不是停止条件之一吗?或者两者结合起来作为停止条件?

最佳答案

它停止是因为 x 最终变成 10,在这种情况下 fib 不会调用自身不再如此,因为 if (x === 0)if (x === 1) 开始起作用。

or are both of them combined a stopping condition?

正是如此。您需要两者,因为 fib 既使用 x-1 调用自身,又使用 x-2 调用自身(如果 x 不是 01)。如果删除 else if (x === 1),请想一下当 x1 并且它用以下命令调用自身时会发生什么x-2。 :-)

如果您添加一些工具,这可以更容易地可视化:

function fib(x, indent) {
  var rv;
  
  log(indent + "fib(" + x + ")");
  if (x === 0) {
    log(indent + "Stopping (x is 0)");
    rv = 0;
  } else if (x === 1) {
    log(indent + "Stopping (x is 1)");
    rv = 1;
  } else {
    log(indent + "Recursing");
    rv = fib(x-1, indent + " ")+fib(x-2, indent + " ");
  }
  log(indent + "fib(" + x + ") returning " + rv);
  return rv;
}
fib(4, " ");

function log(msg) {
  var p = document.createElement('pre');
  p.innerHTML = String(msg);
  document.body.appendChild(p);
}
pre {
  font-family: monospace;
  margin: 0;
  padding: 0;
}

关于Javascript 斐波那契递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27890151/

相关文章:

javascript - 在 WebStorm IDE 中突出显示自定义语法结构

go - 动态编程-带内存的树递归

javascript - 递归循环直到我们完成对象 [JS]

r - 数据表 |组内更快的逐行递归更新

scala - 为什么使用隐式转换时会出现无限循环?

haskell - 埃拉托斯特尼筛无限列表

javascript - 使用 AJAX 在 PHP 文件中调用 PHP 方法

javascript - 水平图像 slider 在 chrome 和 IE11 中不起作用

javascript - 如何使用 jQuery 在 <a> 中插入 <image>?

javascript - 如何用 php 数组填充 javascript?