使用递归实现整数反转功能异常,输入123返回356如何解决
问题分析
你给出的代码核心错误出在递归返回逻辑和终止条件的设计上,我们可以拆解输入123时的执行流程看问题:
- 第一层调用
reverse2(123, 0):计算得i=3,最终返回值为3 + reverse2(12, 3) - 第二层调用
reverse2(12, 3):计算得i=32,最终返回值为32 + reverse2(1, 32) - 第三层调用
reverse2(1, 32):计算得i=321,最终返回值为321 + reverse2(0, 321) - 第四层调用
reverse2(0, 321):命中终止条件返回0
最终结果就是3+32+321+0=356,和你得到的运行结果一致。问题总结为两点:
- 递归终止条件错误:当a为0时,说明所有位已经处理完成,应该返回当前已经拼接好的反转结果i,而不是返回0
- 递归返回逻辑冗余:每一层已经把当前位的数值拼接到了i中,不需要再把每层的i做累加,直接返回深层递归的结果即可。
修复后的代码
public class x { public static void main(String[] args) { System.out.println(reverse2(123, 0)); } static int reverse2(int a, int i) { if(a == 0) { // 所有位处理完成,直接返回拼接好的结果i return i; } else { i = i*10 + a%10; // 直接传递递归结果,不需要累加 return reverse2(a/10, i); } } }
如果需要处理负数和整数溢出场景,可以额外加边界判断:比如传入a为负数时先取绝对值处理,最后补负号;返回前判断是否超过int的取值范围即可。
内容的提问来源于stack exchange,提问作者YSJR
相关产品推荐
相关产品推荐

