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

递归实现Crazy数列:ArrayList类型转换与结果异常求助

递归实现Crazy数列的代码修复

需求与问题说明

需求是用递归实现Crazy数列,生成ArrayList<Double>类型的结果:

  • 从10开始,先持续乘2直到数值大于100
  • 接着持续除以3直到数值小于5
  • 要求输入数必须大于0,禁止使用循环

原代码存在两个核心问题:一是ArrayList未指定泛型导致int和Double类型转换冲突,二是递归调用时没有正确合并结果,导致输出值不全。期望输出为:

[10.0, 20.0, 40.0, 80.0, 160.0, 53.333333333333336, 17.77777777777778, 5.9259259259259265, 1.9753086419753088]

原实现代码

import java.util.ArrayList;
import java.util.Arrays;

public class A1 {

    public static void main(String[] args) {

        System.out.println(goUp(10));
//      System.out.println(benNumber(3, 5));

    }

   /* static int benNumber(int a, int b) {
        // TODO your code goes here

    }*/

    public static ArrayList<Double> goUp(int start) {
        ArrayList theList = new ArrayList();
        theList.add(start);
        if (start <= 100) {
            start = start * 2;
            goUp(start);
        } else if (start >= 100) {
            theList.add(start);
        }
        goDown(theList);
        return theList;
    }
    public static ArrayList<Double> goDown(ArrayList<Double> theList) {
        Double start = theList.get(theList.size()-1);
        if (start >= 5) {
            start = start / 3;
            theList.add(start);
            goDown(theList);
        }
        else if (start < 5) {
            theList.add(start);
            return theList;
        }
            return theList;
    }

}

修正后的代码

import java.util.ArrayList;

public class A1 {

    public static void main(String[] args) {
        System.out.println(generateCrazySequence(10));
    }

    public static ArrayList<Double> generateCrazySequence(int start) {
        if (start <= 0) {
            throw new IllegalArgumentException("输入数必须大于0");
        }
        ArrayList<Double> sequence = new ArrayList<>();
        // 执行乘2的递归逻辑
        goUp((double) start, sequence);
        // 乘2结束后执行除以3的递归逻辑
        goDown(sequence.get(sequence.size() - 1), sequence);
        return sequence;
    }

    private static void goUp(double current, ArrayList<Double> sequence) {
        sequence.add(current);
        // 当前值<=100时,继续乘2递归
        if (current <= 100) {
            goUp(current * 2, sequence);
        }
    }

    private static void goDown(double current, ArrayList<Double> sequence) {
        // 只有当前值>=5时,才计算下一个值并递归
        if (current >= 5) {
            double next = current / 3;
            sequence.add(next);
            goDown(next, sequence);
        }
    }
}

修复要点

  • 泛型与类型处理:所有ArrayList明确指定ArrayList<Double>泛型,起始int值转为double后再添加,彻底解决类型转换问题。
  • 递归逻辑修正:
    • 把goUp和goDown改为void方法,直接操作传入的列表,避免之前递归调用时子递归结果被丢弃的问题。
    • 移除goDown中重复添加元素的逻辑,仅在当前值>=5时计算并添加下一个值,避免重复元素。
  • 入口方法优化:新增generateCrazySequence作为统一入口,负责输入校验、调用两个递归方法,逻辑更清晰。
  • 输入校验:添加输入数大于0的判断,不符合时抛出非法参数异常。

内容的提问来源于stack exchange,提问作者Aleks Uher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:45:35