Java递归实现等比数列求和异常咨询:预期62却返回32
等比数列递归求和问题分析
嘿,我来帮你拆解一下这两段代码的问题,以及正确的递归思路应该是怎样的~
首先,先明确你要实现的等比数列:首项term=2,公比ratio=2,项数n=5,对应的数列是2、4、8、16、32,总和确实是62。你的两段代码最后都返回32,核心问题是递归逻辑里没有把当前项加到总和里,我们来逐个看:
第一段代码的问题
public static double sumGeom(double term, double ratio, int n) { double sum = 0; if (n<=1) { return term; } else { sum = sum + term * ratio; return sumGeom(term * ratio, ratio, n-1); } }
这里的错误很明显:你在else块里计算了sum = 0 + term*ratio,但这个sum变量完全没被用到——你直接返回了递归调用sumGeom(term*ratio, ratio, n-1)的结果。递归的过程其实是不断把term更新为下一项,n减1,直到n=1时返回最后一项32,整个递归链最后就只会返回这个最后一项,自然得不到总和。
第二段代码的问题
public static double sumGeom(double term, double ratio, int n) { double sum = 0; if (n<=1) { return term; } else { return sum = sum + sumGeom(term * ratio, ratio, n-1); } }
这段代码的问题和第一段本质一样:sum初始是0,所以sum + sumGeom(...)等价于直接返回递归调用的结果,同样没有把当前的term加到总和里。递归到最后还是只返回最后一项32。
正确的递归逻辑
递归的核心是把大问题拆解成小问题:求n项等比数列的和,等于当前首项term加上剩下n-1项的和(剩下的n-1项的首项是term*ratio,公比还是ratio)。
对应的正确代码应该是这样:
public static double sumGeom(double term, double ratio, int n) { if (n <= 1) { // 当只剩1项时,和就是当前项本身 return term; } else { // 当前项 + 后面n-1项的和 return term + sumGeom(term * ratio, ratio, n - 1); } }
我们来走一遍递归过程验证:
sumGeom(2, 2, 5)→ 2 + sumGeom(4, 2, 4)sumGeom(4, 2, 4)→4 + sumGeom(8, 2, 3)sumGeom(8, 2, 3)→8 + sumGeom(16, 2, 2)sumGeom(16, 2, 2)→16 + sumGeom(32, 2, 1)sumGeom(32, 2, 1)→返回32
把这些加起来:2+4+8+16+32=62,正好是预期结果。
总结一下
递归求和的关键是每次递归都要把当前项计入总和,而不是只递归处理下一项。你的两段代码都漏掉了当前项的累加,导致最后只返回了最后一项的值。
内容的提问来源于stack exchange,提问作者Jen123
相关产品推荐
相关产品推荐

