起始值定义不同导致斐波那契序列从0或1开始:a=0,b=1输出0,1,1,2…(标准数学定义);a=1,b=1输出1,1,2,3…(常见面试要求)。需注意边界处理、变量更新顺序及int溢出(第47项起)。

用 while 写斐波那契,为什么有人结果从 0 开始、有人从 1 开始?
起始值定义不同,直接决定输出序列形态。Java 里没内置“斐波那契类型”,全靠你手动初始化 a 和 b —— 这俩变量的初值就是源头。
-
a = 0, b = 1:生成0, 1, 1, 2, 3, 5...(标准数学定义) -
a = 1, b = 1:生成1, 1, 2, 3, 5, 8...(常见面试/题目隐含要求) - 如果漏打第一个
print或提前更新了变量,可能直接跳过首项
写法一:边算边输出,适合打印前 N 项
控制项数最直观,循环次数明确,不容易越界。但要注意:第 1 项和第 2 项得单独处理或塞进循环逻辑里。
- 典型结构是先输出
a,再算下一项:int next = a + b; a = b; b = next; - 如果 N 是 0 或 1,必须提前
return或跳过循环,否则会错印或抛异常 - 用
int存值时,第 47 项开始就溢出(Integer.MAX_VALUE = 2147483647),别硬撑
int n = 10, a = 0, b = 1;
if (n >= 1) System.out.print(a);
if (n >= 2) System.out.print(" " + b);
for (int i = 3; i <= n; i++) {
int next = a + b;
System.out.print(" " + next);
a = b;
b = next;
}写法二:先算再判断,适合生成 ≤ 某值的所有项
这类写法用 while (b 控制,更贴近“只要不超过就继续”的自然逻辑,但容易少打第一项或重复计算。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 必须在循环外先输出
a,否则0, 1, 1, 2...里的第一个0就没了 - 循环体开头就要输出当前
b,然后立刻更新:int next = a + b; a = b; b = next;—— 顺序反了就会多算一次 - 如果 limit 是 0,
b = 1导致循环不进,但a = 0又该不该输出?得按题意单独判断
int limit = 100, a = 0, b = 1;
if (a <= limit) System.out.print(a);
while (b <= limit) {
System.out.print(" " + b);
int next = a + b;
a = b;
b = next;
}
while 里改 a 和 b 的顺序为什么总出错?
这不是风格问题,是数据依赖问题。斐波那契下一值依赖旧的 a 和 b,一旦其中一个被覆盖,另一项再读就是错的。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
a = b; b = a + b;→a已变,b算的是b + b - 正确写法必须用临时变量,或用一步赋值(Java 不支持元组,只能老实用
next) - 有人用
b = b + a; a = b - a;技巧绕过临时变量,但可读性差,且对大数有溢出风险
边界条件和变量生命周期比循环语法本身更常出问题。写完别急着跑,先盯两秒 a 和 b 在每次迭代前后到底存的什么。

















