递归反转整数数字代码问题求助:静态变量引发重复输出异常
问题分析与修复方案
你猜的完全没错!问题确实出在公共静态变量reverted上。
为什么会出现这种异常?
静态变量的生命周期是整个应用程序运行期间,它不会在方法调用结束后自动重置。第一次调用reverse(123)后,reverted的值变成了321;第二次调用reverse(456)时,程序会在321的基础上继续拼接456反转后的数字,所以得到了321654;第三次调用reverse(731)时,又会在之前的结果上继续累积,最终输出321654137——本质就是静态变量的状态被跨调用污染了。
修复方案:用递归参数替代静态变量
最优雅的解决方式是去掉静态变量,改用递归参数来保存反转过程中的中间结果,这样每次调用反转方法时都会初始化全新的状态,不会有交叉污染的问题。修改后的代码如下:
using System; public class Program { public static void Main(string[] args) { Console.WriteLine(Reverse(123)); // 输出321 Console.WriteLine(Reverse(456)); // 输出654 Console.WriteLine(Reverse(731)); // 输出137 } // 对外提供的反转方法,负责初始化递归的初始状态 public static int Reverse(int num) { return ReverseHelper(num, 0); } // 递归辅助方法,用参数保存当前反转结果 private static int ReverseHelper(int num, int reverted) { // 递归终止条件:当原数字被拆解完时,返回反转结果 if (num == 0) { return reverted; } // 计算当前步骤的反转结果:之前的结果*10 + 原数字的最后一位 reverted = reverted * 10 + num % 10; // 递归处理去掉最后一位的原数字 return ReverseHelper(num / 10, reverted); } }
方案说明
- 我们新增了一个私有辅助方法
ReverseHelper,它接收两个参数:待拆解的原数字,以及当前已经反转好的部分结果。 - 每次调用
Reverse方法时,都会以0作为初始反转结果调用辅助方法,确保每次反转都是独立的,不会受到之前调用的影响。 - 递归过程中,通过参数传递状态,完全避免了静态变量带来的状态污染问题。
如果你坚持要使用静态变量的思路(不推荐,因为容易出错),那必须在每次调用reverse前手动将reverted重置为0,但这种方式很容易因为忘记重置而再次出现问题,所以更推荐上面的参数传递方案。
内容的提问来源于stack exchange,提问作者FunnyBuzer
相关产品推荐
相关产品推荐

