跳至主要內容

2803. 阶乘生成器 🔒


2803. 阶乘生成器 🔒

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

题目

Write a generator function that takes an integer n as an argument and returns a generator object which yields the factorial sequence.

The factorial sequence is defined by the relation n! = n * (n-1) * (n-2) * ... * 2 * 1​​​.

The factorial of 0 is defined as 1.

Example 1:

Input: n = 5

Output: [1,2,6,24,120]

Explanation:

const gen = factorial(5);
gen.next().value; // 1
gen.next().value; // 2
gen.next().value; // 6
gen.next().value; // 24
gen.next().value; // 120

Example 2:

Input: n = 2

Output: [1,2]

Explanation:

const gen = factorial(2);
gen.next().value; // 1
gen.next().value; // 2

Example 3:

Input: n = 0

Output: [1]

Explanation:

const gen = factorial(0);
gen.next().value; // 1

Constraints:

  • 0 <= n <= 18

题目大意

编写一个生成器函数,该函数以一个整数 n 作为参数,并返回一个生成器对象,该生成器对象可以生成 阶乘序列

阶乘序列 的定义如下:n! = n * (n-1) * (n-2) * ... * 2 * 1

0 的阶乘被定义为 1。

示例 1:

输入: n = 5

输出:[1,2,6,24,120]

解释:

const gen = factorial(5);
gen.next().value; // 1
gen.next().value; // 2
gen.next().value; // 6
gen.next().value; // 24
gen.next().value; // 120

示例 2:

输入: n = 2

输出:[1,2]

解释:

const gen = factorial(2);
gen.next().value; // 1
gen.next().value; // 2

示例 3:

输入: n = 0

输出:[1]

解释:

const gen = factorial(0);
gen.next().value; // 1

提示:

  • 0 <= n <= 18

解题思路

可以创建一个生成器函数 factorialGenerator,它接收一个整数 n 作为参数,并生成从 0!n! 的阶乘序列。

  1. 初始化一个变量 res1(即 0! 的值)。
  2. n = 0 时,直接 yield res
  3. 使用 for 循环从 1n,每次生成器调用 next() 时,都根据阶乘定义计算并更新阶乘值 res *= i,并返回当前的阶乘值。

代码

var factorial = function* (n) {
	let res = 1;
	if (n == 0) {
		yield res;
	}
	for (let i = 1; i <= n; i++) {
		res *= i;
		yield res;
	}
};