2648. 生成斐波那契数列
2648. 生成斐波那契数列
题目
Write a generator function that returns a generator object which yields the fibonacci sequence.
The fibonacci sequence is defined by the relation Xn = Xn-1 + Xn-2
.
The first few numbers of the series are 0, 1, 1, 2, 3, 5, 8, 13
.
Example 1:
Input: callCount = 5
Output: [0,1,1,2,3]
Explanation:
const gen = fibGenerator();
gen.next().value; // 0
gen.next().value; // 1
gen.next().value; // 1
gen.next().value; // 2
gen.next().value; // 3
Example 2:
Input: callCount = 0
Output: []
Explanation: gen.next() is never called so nothing is outputted
Constraints:
0 <= callCount <= 50
题目大意
请你编写一个生成器函数,并返回一个可以生成 斐波那契数列 的生成器对象。
斐波那契数列 的递推公式为 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
解题思路
题目要求创建一个生成器函数来生成斐波那契数列。
首先来回顾一下 生成器函数 的相关知识:
- 可以用
function*
声明创建一个GeneratorFunction
对象。 - 每次调用生成器函数时,它都会返回一个新的
Generator
对象,该对象符合迭代器协议。 - 当迭代器的
next()
方法被调用时,生成器函数的主体会被执行,直到遇到第一个yield
表达式,该表达式指定了迭代器要返回的值,或者用yield*
委托给另一个生成器函数。 next()
方法返回一个对象,其value
属性包含了yield
表达式的值,done
属性是布尔类型,表示生成器是否已经返回了最后一个值。- 如果
next()
方法带有参数,那么它会恢复生成器函数的执行,并用参数替换暂停执行的yield
表达式。
本题的解题思路如下:
生成器函数:
fibGenerator
函数使用function*
语法定义为生成器。- 它初始化两个变量
a
和b
,分别表示当前和下一个斐波那契数。 while (true)
循环使其能够无限生成斐波那契数。
返回值:
yield
语句会暂停函数并返回当前的a
的值。- 在返回之后,更新
a
和b
为下两个斐波那契数。
代码
/**
* @return {Generator<number>}
*/
var fibGenerator = function* () {
// 初始化前两个斐波那契数
let a = 0,
b = 1;
// 创建无限循环
while (true) {
// 返回当前的斐波那契数
yield a;
// 更新下一个斐波那契数
let cur = a;
a = b;
b = cur + b;
}
};
/**
* const gen = fibGenerator();
* gen.next().value; // 0
* gen.next().value; // 1
*/
相关题目
题号 | 标题 | 题解 | 标签 | 难度 |
---|---|---|---|---|
2649 | 嵌套数组生成器 | [✓] | ||
2650 | 设计可取消函数 | [✓] |