如何创建一个Javascript生成器来计算Fibonacci序列?

pru*_*i87 1 javascript generator fibonacci

我把一个生成器放在一起来计算Fibonacci数/序列.但是,它没有按照我的预期运作.我已经从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);
}
Run Code Online (Sandbox Code Playgroud)

我认为这是一个可变范围的问题.我这样做是为了让这个工作:

// 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);
}
Run Code Online (Sandbox Code Playgroud)

但是,我仍然不明白为什么我需要在循环中声明第三个变量("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);
}
Run Code Online (Sandbox Code Playgroud)

非常感谢你!

Frx*_*rem 7

如果您的原始代码是Python,您可能有这样的声明:

a, b = b, a + b
Run Code Online (Sandbox Code Playgroud)

这将设置abba + b在同一时间,这是斐波那契序列的期望行为.

但是,当您将此代码翻译为JavaScript时,您将其分为两个步骤:

a = b
b = a + b
Run Code Online (Sandbox Code Playgroud)

在这种情况下,首先完成第一个分配,然后完成第二个分配.换句话说,第二个分配受第一个分配的影响.要了解这是怎么回事,请考虑以下情况a = 0, b = 1.在这些分配之后,我们期望a = 1, b = 1(因为1是下一个斐波纳契数).然而:

// a = 0, b = 1
a = b
// a = 1, b = 1
b = a + b
// a = 1, b = 2
Run Code Online (Sandbox Code Playgroud)

这显然是错的.

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

[ a, b ] = [ b, a + b ]
Run Code Online (Sandbox Code Playgroud)