【问题标题】:Javascript/ variable place/ what is wrong with the codeJavascript/变量位置/代码有什么问题
【发布时间】:2022-12-06 22:18:11
【问题描述】:

我想用 Javascript 为斐波那契数列编写一个生成器; 0,1,1,2,5,7,12.....(要生成序列,您必须添加最后两个数字) 但是当我将 output.length 分配给代码不起作用的变量时我遇到了这个问题,如果我直接写下来而不是“newNumber”,那么代码仍然有效,但我不明白有什么问题第一个。变量的位置有问题吗?

function fibonacciGenerator(n) {
  var output = [];
  var lastNumber = output[output.length - 1];
  var nPrev = output[output.length - 2];
  var newNumber = lastNumber + nPrev;

  if (n === 1) {
    output = [0];
  } else if (n === 2) {
    output = [0, 1];
  } else {
    output = [0, 1];
    for (var i = 2; i < n; i++) {
      output.push(newNumber);
    }
  }
  return output
}

console.log(fibonacciGenerator(5));

【问题讨论】:

  • 当您将 output.length 分配给变量时,它会捕获长度在分配的时候,当长度改变时它不会“自动更新”。当您直接插入它时,.length 属性访问将捕获那个时刻的价值,因为你通过推动它来改变输出的长度。
  • 并且 output.push(newNumber); 将一次又一次地向输出数组推送相同的值 (NaN),因为您应该在每次迭代时填充 newNumber 变量。我有一个非常非常普遍的建议...如果您在代码中的任何位置使用语句 debugger; 并且您在开发人员工具打开(并且调试器选项卡处于活动状态)的情况下加载页面,调试器将在那个确切的点中断你可以亲眼看到一步一步发生的事情

标签: javascript


【解决方案1】:
function fibonacciGenerator(n) {
  // Return an empty array if n is less than 1
  if (n < 1) {
    return [];
  }

  // Initialize the output array with the first two numbers in the sequence
  var output = [0, 1];

  // If n is 1 or 2, we can return the array now
  if (n <= 2) {
    return output;
  }

  // Loop through the remaining numbers in the sequence
  for (var i = 2; i < n; i++) {
    // Calculate the next number in the sequence
    var lastNumber = output[output.length - 1];
    var nPrev = output[output.length - 2];
    var newNumber = lastNumber + nPrev;

    // Add the new number to the output array
    output.push(newNumber);
  }

  // Return the output array
  return output;
}

【讨论】:

    【解决方案2】:

    此函数尝试生成给定长度 n 的斐波那契数列。但是,代码存在一些问题。

    首先,最后号码上一篇变量未正确初始化。正如目前所写的那样,这些变量将始终未定义,这将导致新号码变量也是不明确的.这将导致为了循环不执行,函数将始终返回一个包含一个或两个元素的数组,具体取决于 n 的值。

    此外,即使最后号码上一篇变量被正确初始化,新号码变量仍然会被错误计算。要正确计算斐波那契数列中的下一个数,您需要对数列中的最后两个数求和,而不是最后一个数和倒数第二个数。

    这是您可以重写函数以正确生成斐波那契数列的一种方法:

    function fibonacciGenerator(n) {
      var output = [];
      if (n === 1) {
        output = [0];
      } else if (n === 2) {
        output = [0, 1];
      } else {
        output = [0, 1];
        for (var i = 2; i < n; i++) {
          var lastTwoNumbers = output.slice(-2);
          var newNumber = lastTwoNumbers[0] + lastTwoNumbers[1];
          output.push(newNumber);
        }
      }
      return output;
    }
    

    这个函数初始化输出具有一个或两个元素的数组,具体取决于n.那么,如果n大于二,它使用一个为了循环遍历序列中剩余的数字并将它们附加到输出大批。为了计算每个新数字,它使用数组.prototype.slice()方法获取序列中的最后两个数字,然后将这些数字相加以获得序列中的下一个数字。

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 2020-12-28
      • 2021-04-05
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多