JavaScript中用Generator实现斐波那契数列的核心是function*定义生成器函数并用yield按需产出数值,典型写法为维护a、b两状态变量循环yield与更新,支持无限生成、数量/最大值限制及获取第n项。

JavaScript 中用 Generator 实现斐波那契数列,核心是利用 function* 定义生成器函数,配合 yield 暂停执行并逐个产出数值,既节省内存又支持按需计算。
基本实现:无限生成斐波那契数列
最简洁的写法是维护两个状态变量(a 和 b),每次 yield 当前项后更新为下一项:
function* fibonacci() {
let [a, b] = [0, 1];
while (true) {
yield a;
[a, b] = [b, a + b];
}
}调用后返回一个迭代器,可手动调用 next(),或用 for...of 遍历:
const fib = fibonacci();
console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2
<p>// 或取前 10 项
for (const num of fibonacci()) {
if (num > 55) break; // 控制退出条件
console.log(num); // 0 1 1 2 3 5 8 13 21 34 55
}带上限的版本:生成指定数量或最大值内的斐波那契数
更实用的场景是限制输出长度或范围。可通过参数控制:
立即学习“Java免费学习笔记(深入)”;
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
-
按数量生成:传入
count,用计数器终止循环 -
按最大值生成:传入
max,当a > max时break
示例(按数量):
function* fibonacciCount(count) {
let [a, b] = [0, 1];
for (let i = 0; i < count; i++) {
yield a;
[a, b] = [b, a + b];
}
}
// 使用
[...fibonacciCount(8)]; // [0, 1, 1, 2, 3, 5, 8, 13]结合迭代器方法:获取第 n 项或转换为数组
Generator 返回的是迭代器对象,可灵活组合原生方法:
- 用展开运算符
[...gen]转为数组(注意:无限生成器会卡死,务必先限制) - 用
Array.from(gen, (v, i) => ...)做映射 - 手动调用
next()多次获取第 n 项(例如第 10 项)
获取第 n 项(索引从 0 开始):
function getFibAt(n) {
const gen = fibonacci();
let value;
for (let i = 0; i <= n; i++) {
value = gen.next().value;
}
return value;
}
getFibAt(10); // 55注意事项与常见误区
使用 Generator 实现时需注意:
- 不要对无限生成器直接用
[...fibonacci()],会进入死循环 -
yield只在暂停时返回值,后续调用next()才继续执行 - 每次调用
fibonacci()都创建新迭代器,彼此状态不共享 - 若需重用,应重新调用生成器函数,而不是重复调用同一个迭代器的
next()
Generator 的懒执行特性让它非常适合处理像斐波那契这样可以无限延伸、但实际只需前若干项的序列。

















