javascript - 如何向我的斐波那契数列添加停止指令?

标签 javascript recursion

我正在尝试使用递归来制作斐波那契算法。我想将所有斐波那契数列打印到此 res 变量,并在超过此 num 参数时停止。我想知道我该如何做到这一点?这段代码:

function fibs(num) {
    let i = 2;
    let res = 0;
    while (res < num) {
        res = fibs(i - 1) + fibs(i - 2);
        i++;
    }
    return res;
}
console.log(fibs(10));

我收到超出最大调用堆栈大小的错误。

最佳答案

注释:

⚠️ 通过使用第一个解决方案,虽然有一些小错误,例如添加一个大数字,但您仍然可以超过最大调用堆栈大小。如果你想想递归函数的意义,它一次又一次地调用自身,而且它的计算时间很长。

👌 使用第二种解决方案,从技术上讲,您仅使用当前堆栈来计算结果。功能看起来更大但并不昂贵。

解决方案:

第一个解决方案 - 递归:

如果您仍然想使用递归解决方案,则此解决方案比原始解决方案简单得多:

const fibs = (num) => {
  if (num === 1 || num === 2) {
     return 1;
  }
     
  return fibs(num - 1) + fibs(num - 2);
};

// 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
for (let i = 1; i <= 10; i++) {
 console.log(`fibs(${i}):`, fibs(i)); 
}

第二种解决方案 - 非递归:

总有更好的解决方案,如果我打赌我宁愿选择非递归解决方案,请在下面找到一个示例:

const fibs = (num) => {
  if (num === 1 || num === 2) {
     return 1;
  }

  let result = 1;
  let resultPrevious = 1;
  
  for(let i = 2; i < num; i++) {
    const temp = result;
    result += resultPrevious;
    resultPrevious = temp;
  }
  
  return result;
};

// 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
for (let i = 1; i <= 10; i++) {
 console.log(`fibs(${i}):`, fibs(i)); 
}

我感兴趣的是,在运行 fibs(30) 的情况下,非递归解决方案如何更快,请查看下面的结果:

enter image description here

从结果来看,在测试值 30 时,递归解决方案似乎慢了 98.86%。

希望这会有所帮助!

关于javascript - 如何向我的斐波那契数列添加停止指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59022341/

相关文章:

javascript - 平均分隔按钮间距并使其响应

javascript - 针对剧烈变异的远程 API 进行快照测试 API 客户端

Java二叉搜索树递归复制树

python - 如何在python中找出具有相同结构的两个列表?

java - 在 Java Blackjack Simulator 中处理分割 - 递归?

javascript - this.echo 在 this.thenOpen 中不起作用

JavaScript 不从缓存加载文件

java - 扫雷递归,stackoverflow

javascript - 为什么 nodejs 在我的 BIT(1) 行上返回一个笑脸?

javascript - 按类属性排序对象的树结构