如何用递归实现指定范围内偶数的打印与求和?解决代码迭代异常
解决递归实现范围偶数打印与求和的问题
我帮你分析下当前代码的问题,然后给出两种可行的修复方案,让它能正确输出指定范围内的偶数求和表达式~
原代码的问题分析
先看你遇到的场景:当范围两端都是奇数(比如3到9)时,输出了+4+6+8+10=28,明显不符合预期。问题出在这几个地方:
- 递归终止逻辑错误:原代码中当
number2 < number时返回的number + number%2(比如3会返回4),之后逐层递归返回时会加2,最后得到10——这个数已经超出了上限9,但代码没有做范围校验,直接输出了。 - 全局变量风险:使用全局
sum来累加,递归过程中状态容易混乱,而且代码里sum的声明在调用方法之后,这在C#里是编译错误哦。 - 打印格式问题:原代码输出会以
+开头(比如+4+6+8),不符合常规的表达式格式。
方案一:用递归返回值传递结果(推荐,无全局变量)
这种方式把字符串拼接和求和都通过递归返回值来处理,逻辑更清晰,也避免了全局变量的问题:
// 主程序调用 var (seriesStr, totalSum) = PrintEvenSeriesAndSum(3, 9); Console.WriteLine($"{seriesStr}={totalSum}"); // 递归方法,返回(偶数表达式字符串, 求和结果) static (string, int) PrintEvenSeriesAndSum(int start, int end) { // 边界处理:起始值大于结束值,返回空字符串和0 if (start > end) { return ("", 0); } // 如果当前起始值是奇数,先跳到下一个偶数 if (start % 2 != 0) { return PrintEvenSeriesAndSum(start + 1, end); } // 递归终止:当前值等于结束值,直接返回该数 if (start == end) { return (start.ToString(), start); } // 递归处理下一个偶数 var (subSeries, subSum) = PrintEvenSeriesAndSum(start + 2, end); // 拼接当前数和子表达式,累加求和 return ($"{start}+{subSeries}", start + subSum); }
运行这段代码,输入3到9时会输出4+6+8=18,完全符合预期。
方案二:修复原递归逻辑(保留类似结构)
如果你想尽量保留原代码的结构,可以调整终止条件和范围校验,同时修正打印格式:
int sum = 0; printSeries(3, 9); Console.WriteLine("=" + sum); int printSeries(int number, int number2) { // 边界处理:起始值大于结束值,终止递归 if (number > number2) { return 0; } // 找到当前范围内的第一个偶数 int currentEven = number % 2 == 0 ? number : number + 1; // 如果这个偶数超出范围,终止递归 if (currentEven > number2) { return 0; } // 递归处理下一个偶数 int nextEven = printSeries(currentEven + 2, number2); // 控制打印格式:如果是最后一个数(nextEven为0),不加前置+号 if (nextEven != 0) { Console.Write("+" + currentEven); } else { Console.Write(currentEven); } sum += currentEven; return currentEven; }
这个方案修复了原代码的核心问题:通过判断currentEven > number2避免处理超出范围的数,同时调整打印逻辑去掉了开头的+号。
内容的提问来源于stack exchange,提问作者OddCommand24
相关产品推荐
相关产品推荐

