
本文详解如何编写健壮的递归方法,计算任意顺序输入的两个整数之间(含两端)的所有整数之和,并修正常见逻辑错误,提供简洁、正确且易于理解的实现方案。
本文详解如何编写健壮的递归方法,计算任意顺序输入的两个整数之间(含两端)的所有整数之和,并修正常见逻辑错误,提供简洁、正确且易于理解的实现方案。
在学习递归时,一个经典但极易出错的练习是:对闭区间 [min(a,b), max(a,b)] 内所有整数求和,仅使用递归,不依赖循环或内置求和公式。关键挑战在于处理输入顺序不确定(即 start 可能大于、小于或等于 end)以及递归边界与累加逻辑的准确性。
原始代码存在两处核心错误:
- 当 start == end 时,返回 start + end(即 2 * end),导致单个数字被重复计算;
- 当 start > end 时,递归调用 sumInt(end, start) 未调整步进方向,实际仍从较小值向较大值递增,但累加项错误地用了 end 而未同步更新其值,造成漏加或重复。
以下是修复后的标准实现:
public static int sumInt(int start, int end) {
if (start == end) {
return end; // ✅ 单点区间只返回该值,非两倍
} else if (start < end) {
return start + sumInt(start + 1, end); // ✅ 正向递归:累加当前 start,递归处理 [start+1, end]
} else { // start > end
return end + sumInt(end + 1, start); // ✅ 反向统一为正向:以 end 为起点,递归处理 [end+1, start]
}
}该版本通过将 start > end 的情况转化为等价的正向区间 [end, start],确保每次递归都向“增大”方向推进,且每次累加的是当前区间的左端点值,逻辑清晰、无歧义。
更进一步,可借助 Math.min 和 Math.max 消除分支判断,使代码更简洁、可读性更强:
public static int sumInt(int start, int end) {
if (start == end) return end;
int first = Math.min(start, end);
return first + sumInt(first + 1, Math.max(start, end));
}✅ 验证示例:
- sumInt(2, 6) → 2 + sumInt(3,6) → 2+3+sumInt(4,6) → … → 2+3+4+5+6 = 20
- sumInt(6, 2) → 2 + sumInt(3,6) → 同上 → 20
⚠️ 注意事项:
- 此递归深度为 |start − end| + 1,对极大差值可能引发栈溢出,生产环境应优先使用数学公式 sum = (a + b) * |a − b + 1| / 2 或迭代;
- Java 中整数溢出不会抛异常,若输入范围大,建议使用 long 参数类型并返回 long;
- 所有递归必须保证有明确终止条件(此处为 start == end)和每次调用都向终止条件收敛(步长为 ±1,区间长度严格减小)。
掌握此类基础递归结构,是理解分治、树遍历、回溯等高级算法的重要基石。

















