2016-12-26 104 views
1

我已经放在一起生成器来计算斐波纳契数字/序列。但是,它并没有像我期望的那样工作。我从python“转译”它,但我不知道它是什么在我的JavaScript代码,不符合我的逻辑python做的...任何人都可以给我一个提示呢?如何创建一个Javascript生成器来计算斐波那契数列?

下面的代码:

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

不过,我还是不明白,为什么我需要声明一个第三个变量(“电流”),我的内循环,以获得理想的结果。有任何想法吗?

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

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

非常感谢您!

+0

你能解释你认为是错的吗?更好的是,你可以添加一个失败的测试并解释出了什么问题?此外,stackovflow允许您将代码嵌入到可运行的小部件中,以便每个人都可以简单地运行要添加的测试,并查看实际存在的错误! –

+4

注意在'b = a + b'你已经设置了'a = b',所以这只是'b = 2 * b'。你可能想做'[a,b] = [b,a + b]'来模拟这两个任务(就像在Python中一样)。 – Frxstrem

回答

7

如果您的原始代码是在Python,你可能有这样的语句:

a, b = b, a + b 

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

但是,当你翻译这个代码为JavaScript,请区分它分为两个步骤:

a = b 
b = a + b 

在这种情况下,第一个任务是先进行,然后第二个。换句话说,第二项任务受到第一项的影响。要看看这是怎么回事,请考虑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 

这显然是错误的。

如果您使用ES6(你很有可能会做,因为你已经在使用发电机)中,您可以通过实际使用数组destructuing写这类似于Python的语句:

[ a, b ] = [ b, a + b ]