
本文详解如何用迭代法正确实现从1累加到n(即n + (n−1) + … + 2 + 1),指出常见循环逻辑错误,给出三种等效实现方式(正向/反向迭代、闭式公式),并解析+=运算符含义及边界条件处理要点。
本文详解如何用迭代法正确实现从1累加到n(即n + (n−1) + … + 2 + 1),指出常见循环逻辑错误,给出三种等效实现方式(正向/反向迭代、闭式公式),并解析`+=`运算符含义及边界条件处理要点。
在解决“求1到n的连续整数和”这一经典问题时,许多初学者在从递归转向迭代时容易陷入循环变量设计误区。你提供的代码片段:
for (int i = 1; i < num; i++) {
s += n - 1; // ❌ 错误:始终加的是固定值 (n-1),而非动态递减项
}存在两个关键问题:
- 循环范围错误:i < num 导致只执行 num−1 次,但我们需要累加 n 个数(从 n 到 1,共 n 项);
- 表达式静态化:n - 1 是常量,未随循环进度变化——实际应为 n - i 或 i,体现逐项递减/递增关系。
✅ 正确的迭代实现有两种等价思路:
方法一:从 n 递减至 1(贴合题干描述顺序)
int sum = 0;
int n = 5; // 示例输入
for (int i = 0; i < n; i++) {
sum += n - i; // i=0→加n, i=1→加n-1, ..., i=n-1→加1
}
// 结果:sum = 5+4+3+2+1 = 15方法二:从 1 递增至 n(更直观,推荐)
int sum = 0;
int n = 5;
for (int i = 1; i <= n; i++) { // 注意:边界是 <= n,确保包含 n
sum += i; // i=1→加1, i=2→加2, ..., i=n→加n
}
// 结果相同:15⚠️ 关于 s += n - 1 的含义:
这是复合赋值运算符,等价于 s = s + (n - 1)。它将右侧表达式结果(此处为固定值 n−1)累加到变量 s 当前值上。但在本题中,因缺少动态索引(如 i),它无法实现“逐项减1”的累加逻辑,导致结果恒为 (n−1) × 循环次数,与预期不符。
? 进阶优化:使用数学闭式公式
该数列为首项为1、末项为n、公差为1的等差数列,其和可直接由高斯公式计算:
$$
\text{sum} = \frac{n \times (n + 1)}{2}
$$
Java实现:
int n = 5; int sum = n * (n + 1) / 2; // 时间复杂度 O(1),无循环开销
此方式效率最高,且避免了循环边界错误风险。
? 总结建议:
- 迭代时优先采用 for (int i = 1; i <= n; i++) 结构,语义清晰、不易出错;
- 务必检查循环条件(< vs <=)与初始值,确保项数准确(共 n 项);
- 理解 += 是“原地累加”,但右侧表达式必须反映业务逻辑中的变量关系;
- 对于等差数列求和,闭式公式是简洁、高效、零bug的首选方案。

















