使用递归缩减BigInteger时出现异常循环问题求助
问题描述
作业要求实现一个递归缩减BigInteger的方法:
- 若数字为偶数,将其减半后重复操作
- 若为奇数,将其乘3加1后重复操作
- 统计操作次数,直到数字变为1时返回总次数
实际运行时发现,BigInteger先缩减到1,之后却开始向上循环,数值不断增大,计数器也随之递减,找不到原因。
附上原代码:
public int Problem9(BigInteger value) { BigInteger zero = BigInteger.valueOf(0); BigInteger one = BigInteger.valueOf(1); BigInteger two = BigInteger.valueOf(2); BigInteger three = BigInteger.valueOf(3); int count = reduceBigInt(value, zero, one, two, three, 1); return count; } public int reduceBigInt(BigInteger num, BigInteger zero, BigInteger one, BigInteger two, BigInteger three, int i) { if (num.equals(one)) return i; else if ((num.remainder(two)) == zero) reduceBigInt((num.divide(two)), zero, one, two, three, i++); else reduceBigInt((num.multiply(three).add(one)), zero, one, two, three, i++); return i; }
问题分析与修复
你的代码存在两个关键错误:
BigInteger值比较错误:
用==比较num.remainder(two)和zero是在比较对象引用,而非实际数值。BigInteger是引用类型,必须用equals()方法做值比较,正确判断偶数的写法是num.remainder(two).equals(zero)。递归结果未传递+计数器递增错误:
- 调用递归方法后没有返回其结果,而是直接执行
return i,导致递归栈回溯时返回的是当前层的初始i值,出现计数器递减的假象。 i++是后置递增,传递给递归方法的是递增前的数值,应该用i+1(无副作用,更安全)来传递更新后的计数。
- 调用递归方法后没有返回其结果,而是直接执行
修复后的代码:
public int Problem9(BigInteger value) { BigInteger zero = BigInteger.valueOf(0); BigInteger one = BigInteger.valueOf(1); BigInteger two = BigInteger.valueOf(2); BigInteger three = BigInteger.valueOf(3); return reduceBigInt(value, zero, one, two, three, 0); // 初始计数设为0,符合"操作次数"定义 } public int reduceBigInt(BigInteger num, BigInteger zero, BigInteger one, BigInteger two, BigInteger three, int count) { if (num.equals(one)) { return count; } else if (num.remainder(two).equals(zero)) { return reduceBigInt(num.divide(two), zero, one, two, three, count + 1); } else { return reduceBigInt(num.multiply(three).add(one), zero, one, two, three, count + 1); } }
补充说明:
- 初始计数改为0更合理:输入为1时操作次数为0,每执行一次变换(减半/乘3加1)计数加1,符合实际操作次数统计逻辑。
- 去掉了冗余的
return i,直接返回递归调用结果,保证计数能正确沿着递归栈向上传递。
内容的提问来源于stack exchange,提问作者Jesse Lucas
相关产品推荐
相关产品推荐

