请你编写一个生成器函数,并返回一个可以生成 斐波那契数列 的生成器对象。
斐波那契数列 的递推公式为 Xn = Xn-1 + Xn-2 。
这个数列的前几个数字是 0, 1, 1, 2, 3, 5, 8, 13 。
示例 1:
输入: callCount = 5
输出: [0,1,1,2,3]
解释:
const gen = fibGenerator();
gen.next().value; // 0
gen.next().value; // 1
gen.next().value; // 1
gen.next().value; // 2
gen.next().value; // 3
示例 2:
输入: callCount = 0
输出: []
解释: gen.next() 永远不会被调用,所以什么也不会输出
提示:
0 <= callCount <= 50
参考方案:
/**
* @return {Generator<number>}
*/
var fibGenerator = function* () {
let pre = 0
let cur = 1
while (true) {
yield pre;
[pre, cur] = [cur, pre + cur]
};
};
/**
* const gen = fibGenerator();
* gen.next().value; // 0
* gen.next().value; // 1
*/
方案提示:
这个生成器函数首先定义了两个变量 pre 和 cur ,分别表示斐波那契数列的前两个数字。然后,它使用一个 while 循环不断生成斐波那契数列。在每次循环中,它会将 cur 的值赋给 pre ,然后将 pre + cur 的值赋给 cur 。最后,它会将 pre 的值作为生成器函数的返回值。
在每次迭代中,我们首先通过yield关键字产生当前的斐波那契数,然后更新prev和curr以准备产生下一个斐波那契数。
这里需要注意的是,由于yield会暂停函数的执行,因此[pre, cur] = [cur, pre + cur]这一行代码实际上是在yield暂停后,也就是在下一次迭代开始时执行的。这就保证了在每次迭代中,我们都能准确地产生出斐波那契数列中的下一个数字,来用这个生成器函数来生成斐波那契数列。
LeetCode: