【问题标题】:How do i use while loop while figuring out Fibonacci series?如何在计算斐波那契数列时使用 while 循环?
【发布时间】:2022-01-15 22:05:00
【问题描述】:

我刚开始使用Js,遇到了Js的问题,找不到类似的解决方案,如果有人帮助,将不胜感激。

var i = 0;
var j = 1;
var k = 0;

function fibbo(n) {
  if (n === 1) {
    console.log([0]);
  } else if (n === 2) {
    console.log([0, 1]);
  } else {
    while (k <= n) {
      var l = [0, 1];
      var b = l.length;
      l.push(l[b - 2] + l[b - 1]);
      k++;
    }

  }
  return l;
}
fibbo(4);
console.log(l);

【问题讨论】:

  • 关于这个问题的问题是,有很多方法可以弄清楚如何让它发挥作用。当问这样的问题时,你可能应该选择最快和最短的答案。

标签: javascript arrays


【解决方案1】:

确保在函数内本地声明变量,如果这是使用它们的地方。你可以用不同的方式处理基本情况(设置length属性),还有最近的JS方法Array#at...:

function fibo(n) {
    const l = [0, 1];
    while (l.length < n) l.push(l.at(-2) + l.at(-1));
    l.length = n; // for the case n < 2
    return l;
}
console.log(fibo(4));

【讨论】:

    【解决方案2】:

    除了尝试在函数之外访问l,当为函数提供0 或1 时,返回语句中的l 有时是未定义的。更重要的是,l 不应在 while 循环中定义,而应在其外部。

    此外,您还有诸如ij 等未使用的变量,以及正在使用但其范围有问题的k

    1. 它在函数之外,所以重复运行会导致k不断增加
    2. k 用于跟踪迭代次数,而您的代码表明 n 应该是返回的数字数量

    这是一种更简化的逻辑,假设 n 应该是要返回的斐波那契数:

    1. 如果n === 1n === 2,则返回种子数组
    2. 否则,您只需运行一个 while 循环,该循环只会在种子数组超过 n 时停止运行。在 while 循环中,我们保留了压入数字的逻辑,否则不需要任何其他变量递增。

    参见概念验证示例:

    function fibbo(n) {
      if (n === 1) {
        return [0];
      } else if (n === 2) {
        return [0, 1];
      } else {
        const l = [0, 1];
        while (n > l.length) {
          const b = l.length;
          l.push(l[b - 2] + l[b - 1]);
        }
        return l;
      }
    }
    console.log(fibbo(4));

    【讨论】:

      【解决方案3】:

      使用while 循环,我的看法如下:

      n = 0 || n = 1If n &gt; 1 ,它循环 n - 1 次,并在每次迭代中将现有序列中前两个值的总和添加到最后一个索引。

      一旦循环完成,整个序列就会被修剪为n 的长度并返回。 (我的解决方案中最初缺少最后一个修剪部分,并在阅读 trincot 的答案后添加)

      const fibbo = (n) => {
          const sequence = [0, 1];
          let i = 2;
          let next;
          
          while(i <= n) {
              next = sequence[i - 2] + sequence[i - 1];
              sequence[i++] = next;         
          }
      
          return sequence;
      }
      
      console.log(fibbo(6));

      【讨论】:

      • 请对您的代码进行一些解释,说明为什么会这样。
      • 感谢您的通知。在原始答案中添加了简要说明。
      • 没问题,马上+1!
      猜你喜欢
      • 2016-04-28
      • 1970-01-01
      • 2011-11-27
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2020-01-18
      • 1970-01-01
      相关资源
      最近更新 更多