LeetCode(9)--2648. 生成斐波那契数列

96 阅读1分钟

请你编写一个生成器函数,并返回一个可以生成 斐波那契数列 的生成器对象。

斐波那契数列 的递推公式为 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
 */

 

方案提示:

这个生成器函数首先定义了两个变量 precur ,分别表示斐波那契数列的前两个数字。然后,它使用一个 while 循环不断生成斐波那契数列。在每次循环中,它会将 cur 的值赋给 pre ,然后将 pre + cur 的值赋给 cur 。最后,它会将 pre 的值作为生成器函数的返回值。 在每次迭代中,我们首先通过yield关键字产生当前的斐波那契数,然后更新prev和curr以准备产生下一个斐波那契数。

这里需要注意的是,由于yield会暂停函数的执行,因此[pre, cur] = [cur, pre + cur]这一行代码实际上是在yield暂停后,也就是在下一次迭代开始时执行的。这就保证了在每次迭代中,我们都能准确地产生出斐波那契数列中的下一个数字,来用这个生成器函数来生成斐波那契数列。

 

LeetCode:

111.png