如何创建一个 Javascript 生成器来计算斐波那契数列?

How to create a Javascript generator to calculate the Fibonacci sequence?

我组装了一个生成器来计算斐波那契 numbers/sequence。但是,它没有像我预期的那样工作。我从 python 那里得到了 "transpiled" 但我不知道我的 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") 以获得理想的结果。有什么想法吗?

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

// 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);
}

非常感谢!

如果您的原始代码在 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 ]