【发布时间】: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