【问题标题】:How to create a Javascript generator to calculate the Fibonacci sequence?如何创建一个 Javascript 生成器来计算斐波那契数列?
【发布时间】:2017-05-10 14:01:06
【问题描述】:

我已经组装了一个生成器来计算斐波那契数/序列。但是,它没有按我的预期工作。我已经从 python 中“转译”了它,但我不知道我的 JavaScript 代码中有什么不符合我的逻辑,就像 python 那样......谁能给我一个提示?

代码如下:

// Fibonacci generator
function* fibonacci() {
  var a = 0;
  var b = 1;
  while (true) {
    yield a;
    a = b;
    b = a + b;
  }
}

// Instantiates the fibonacci generator
fib = fibonacci();

// gets first 10 numbers from the Fibonacci generator starting from 0
for (let i = 0; i < 10; i++) {
  console.log(i + ' => ' + fib.next().value);
}

我认为这是一个可变范围的问题。我只是这样做了:

// Fibonacci generator
function* fibonacci() {
  var a = 0;
  var b = 1;
  while (true) {
    var current = a;
    a = b;
    b = current + a;
    yield current;
  }
}

// Instantiates the fibonacci generator
var fib = fibonacci();

// gets first 10 numbers from the Fibonacci generator starting from 0
for (let i = 0; i < 10; i++) {
  console.log(i + ' => ' + fib.next().value);
}

但是,我仍然不明白为什么我需要在我的循环中声明第三个变量(“current”)以获得理想的结果。有什么想法吗?

编辑:你们是对的。问题是变量是分两步分配的,因此没有得到所需的值。这是我决定发布以供将来参考的最终工作代码:

// Fibonacci generator
function* fibonacci() {
  [a, b] = [0, 1]
  while (true) {
    yield a;
    [a, b] = [b, a + b]
  }
}

// Instantiates the fibonacci generator
var fib = fibonacci();

// gets first 10 numbers from the Fibonacci generator starting from 0
for (let i = 0; i < 10; i++) {
  console.log(fib.next().value);
}

非常感谢!

【问题讨论】:

  • 你能解释一下你认为哪里错了吗?更好的是,您能否添加一个失败的测试并解释问题所在?此外,stackovflow 允许您将代码嵌入到可运行的小部件中,这样每个人都可以简单地运行您要添加的测试并查看实际错误!
  • 注意b = a + b你已经设置了a = b,所以这只是b = 2 * b。您可能想改用 [ a, b ] = [ b, a + b ] 来同时执行这两个任务(就像在 Python 中一样)。

标签: javascript generator fibonacci


【解决方案1】:

如果您的原始代码是用 Python 编写的,您可能有这样的语句:

a, b = b, a + b

这将同时将a 设置为b,并将b 设置为a + b,这是斐波那契数列的预期行为。

但是,当您将此代码转换为 JavaScript 时,您会将其分为两个步骤:

a = b
b = a + b

在这种情况下,首先完成第一个分配,然后完成第二个分配。换句话说,第二个分配受第一个影响。要了解这是如何出错的,请考虑a = 5, b = 8 的情况。在这些分配之后,我们预计 a = 8, b = 13(因为 13 是下一个斐波那契数)。然而:

// a = 5, b = 8
a = b
// a = 8, b = 8
b = a + b
// a = 8, b = 16

这显然是错误的。

如果您使用的是 ES6(您很可能会这样做,因为您已经在使用生成器),您实际上可以使用数组解构来编写类似于 Python 语句的代码:

[ a, b ] = [ b, a + b ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2017-07-22
    • 1970-01-01
    • 2011-12-18
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多