递归实现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
相关产品推荐
相关产品推荐

