跳至主要內容

2648. 生成斐波那契数列


2648. 生成斐波那契数列open in new window

🟢   🔗 力扣open in new window LeetCodeopen in new window

题目

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 表达式。

本题的解题思路如下:

  1. 生成器函数

    • fibGenerator 函数使用 function* 语法定义为生成器。
    • 它初始化两个变量 ab,分别表示当前和下一个斐波那契数。
    • while (true) 循环使其能够无限生成斐波那契数。
  2. 返回值

    • yield 语句会暂停函数并返回当前的 a 的值。
    • 在返回之后,更新 ab 为下两个斐波那契数。

代码

/**
 * @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嵌套数组生成器open in new window[✓]
2650设计可取消函数open in new window[✓]