如何创建一个 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 ]
我组装了一个生成器来计算斐波那契 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 ]