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)
非常感谢你!
如果您的原始代码是Python,您可能有这样的声明:
a, b = b, a + b
Run Code Online (Sandbox Code Playgroud)
这将设置a到b和b到a + 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)
| 归档时间: |
|
| 查看次数: |
885 次 |
| 最近记录: |