递归实现闭区间求和时出现无限循环及运行时错误求助
嘿,我来帮你揪出这个求和函数的问题!
先看你写的代码:
int sum(int m, int n) { if (m != n) { return m + sum(m++, n); } return n; }
你本来想计算闭区间[m,n]的和,比如sum(2,5)要返回2+3+4+5=14,结果却陷入无限循环还触发运行时错误,问题全出在sum(m++, n)这一行!
问题核心:后置自增的坑
m++是后置自增运算符,它的执行逻辑是:先把当前m的原始值传递给递归函数,然后再给m加1。这就导致每次递归调用时,传给下一层的m和当前层的m完全一样,永远满足m != n的条件,递归根本停不下来,最终栈内存被耗尽,触发运行时错误。
两种简单的修复方案
方案一:改用前置自增++m
前置自增会先把m加1,再把新值传递给递归函数,这样每次递归的m都会逐步向n靠近,直到触发终止条件:
int sum(int m, int n) { if (m != n) { return m + sum(++m, n); } return n; }
方案二:直接传递m + 1(更推荐)
这种方式完全避开自增运算符的陷阱,逻辑更直观,不容易出错:
int sum(int m, int n) { if (m != n) { return m + sum(m + 1, n); } return n; }
测试sum(2,5),这两个版本都能正确返回14,完美实现你的需求。
额外小建议
如果只是计算闭区间的和,其实用数学公式(m + n) * (n - m + 1) / 2效率更高,递归虽然直观,但如果n和m差距很大,还是可能出现栈溢出的问题,公式法就没这个顾虑啦~
内容的提问来源于stack exchange,提问作者pango322
相关产品推荐
相关产品推荐

