C++递归函数计算存款本息:测试结果不符求助
问题排查与修正
核心错误分析
- 递归返回值错误累加:原代码中
return sum + deposit(sum, p, n - 1)完全违背存款计算逻辑,它会把当前期更新后的本金和后续所有期的计算结果重复相加,直接导致数值爆炸。比如你的测试用例里,第一次递归返回110+242=352,就是这个错误造成的。 - 计算逻辑与预期不匹配:当你移除
sum+后,代码实现的是复利计算(每期利息加入本金,下一期按新本金计息),所以得到121(100*(1+10%)²),但你预期的是120,说明你需要的是单利计算(每期利息基于初始本金)。
修正方案
方案1:单利计算的递归实现
单利的核心是每期利息仅基于初始本金,总金额=初始本金+初始本金×利率×期数。递归实现如下:
int deposit(int sum, int p, int n) { if (n == 0) { return sum; } // 每次递归累加一期的单利,本金保持初始值不变 return deposit(sum, p, n - 1) + sum * p / 100; }
测试用例deposit(100,10,2)的执行流程:
- n=2:返回
deposit(100,10,1) + 10 - n=1:返回
deposit(100,10,0) + 10 - n=0:返回100
最终结果:100+10+10=120,完全符合你的预期。
方案2:复利计算的递归实现(若预期值有误)
如果你实际需要的是复利计算,只需修正递归返回逻辑即可:
int deposit(int sum, int p, int n) { if (n == 0) { return sum; } // 复利:每期利息加入本金,下一期按新本金计息 return deposit(sum + sum * p / 100, p, n - 1); }
此时测试用例返回121,是复利计算的正确结果。
内容的提问来源于stack exchange,提问作者GGANGG
相关产品推荐
相关产品推荐

