如何用Java递归实现分数求和?请协助排查现有代码问题
我帮你检查了代码,发现几个关键问题,咱们一步步修正,实现你想要的分数求和功能:
问题分析
- 递归计算逻辑错误:你的
getSum方法里,curStep = 1 / (i + 1.0)这行完全搞反了当前项的计算。比如当i=3时,你应该加的是1/3,但这行代码算出来的是1/4,直接导致求和结果偏差。 - main方法冗余循环:你现在的for循环会从1到n每次都调用递归并打印,这会输出每一步的累加结果,但你的需求是输入n后只输出最终的总和,这个循环完全没必要。
- 边界条件可以简化:虽然你的边界判断没问题,但正常输入都是正整数,所以可以简化递归的终止条件。
修正后的完整代码
import java.util.Scanner; public class FractionSum { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入正整数n:"); int n = scanner.nextInt(); // 调用递归函数获取总和 double totalSum = getSum(n); // 格式化输出结果,保留8位小数 System.out.printf("求和结果为:%.8f%n", totalSum); // 可选:输出对应的求和表达式(比如输入3时输出1/1+1/2+1/3) StringBuilder expression = new StringBuilder(); for (int i = 1; i <= n; i++) { expression.append("1/").append(i); if (i < n) { expression.append("+"); } } System.out.println("对应的表达式:" + expression); scanner.close(); } public static double getSum(int n) { // 递归终止条件:当n=1时,返回1/1的结果 if (n == 1) { return 1.0; } // 递归逻辑:当前项1/n 加上前n-1项的求和结果 return 1.0 / n + getSum(n - 1); } }
代码说明
- 递归函数
getSum现在逻辑清晰:每次递归计算当前项1.0/n,再加上前n-1项的和,完全符合1/1+1/2+...+1/n的求和逻辑。 - main方法去掉了多余的循环,只调用一次递归就能得到最终结果,还额外添加了表达式输出的代码,完美匹配你给出的示例需求。
- 用
printf格式化输出结果,保留8位小数,和你示例里的1.83333333一致。
内容的提问来源于stack exchange,提问作者BlueluLe
相关产品推荐
相关产品推荐

