
本文详解如何用迭代法正确计算1到n的累加和(即n + (n-1) + … + 2 + 1),指出常见循环逻辑错误,对比两种等效循环写法,并引入o(1)时间复杂度的数学公式解法。
本文详解如何用迭代法正确计算1到n的累加和(即n + (n-1) + … + 2 + 1),指出常见循环逻辑错误,对比两种等效循环写法,并引入o(1)时间复杂度的数学公式解法。
在初学循环结构时,一个典型误区是混淆循环变量 i 与被累加项之间的关系。你提供的代码片段:
for (int i = 1; i <p>存在两个关键问题: </p><ol> <li> <strong>表达式 n - 1 是固定值</strong>,不随循环变量 i 改变,导致每次都在重复加同一个数(如 n=5 时,始终加 4); </li> <li> <strong>循环范围错误</strong>:i </li> </ol><p>✅ 正确的迭代思路应确保: </p>
- 每轮累加一个递减或递增的动态项;
- 循环执行恰好 n 次。
✅ 方案一:从 n 递减累加(贴合题意描述)
int sum = 0;
int n = 5; // 示例输入
for (int i = 0; i <p>此处 sum += n - i 等价于 sum = sum + (n - i),是复合赋值运算符,语义清晰且高效。</p><h3>✅ 方案二:从 1 递增累加(更直观,等价变形)</h3><pre class="brush:php;toolbar:false;">int sum = 0;
int n = 5;
for (int i = 1; i <p>该写法逻辑更贴近数学定义 ∑_{i=1}^n i,也避免了 n-i 的索引偏移理解成本。</p><h3>⚡ 方案三:直接使用高斯求和公式(最优解)</h3><p>对于等差数列 1, 2, 3, ..., n(首项 a₁=1,末项 aₙ=n,项数 n),其和为:
[
S_n = \frac{n \times (n + 1)}{2}
]
Java 实现简洁高效:</p><pre class="brush:php;toolbar:false;">int n = 5;
int sum = n * (n + 1) / 2; // 整数运算无精度损失,时间复杂度 O(1)? 注意事项
-
整数溢出风险:当 n 极大(如 > √Integer.MAX_VALUE ≈ 46340)时,n*(n+1) 可能溢出,建议使用 long 类型:
long sum = (long) n * (n + 1) / 2;
- 边界验证:实际应用中需校验 n ≥ 1,负数或零应返回 0;
- 递归 vs 迭代:递归虽直观,但深度过大易栈溢出;迭代与公式法更健壮。
掌握这三种方法,不仅能修正循环逻辑错误,更能理解算法优化的本质:从 O(n) 迭代迈向 O(1) 数学洞察。










