You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用递归缩减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;
}
问题分析与修复

你的代码存在两个关键错误:

  1. BigInteger值比较错误:
    用==比较num.remainder(two)和zero是在比较对象引用,而非实际数值。BigInteger是引用类型,必须用equals()方法做值比较,正确判断偶数的写法是num.remainder(two).equals(zero)。

  2. 递归结果未传递+计数器递增错误:

    • 调用递归方法后没有返回其结果,而是直接执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 07:32:37