You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:34:45