Java递归与迭代方法计算选爱好结果不一致,求排查修正
问题分析与修正方案
核心错误点
- 参数含义不匹配:递归方法中
day代表目标天数(day0对应初始第一个数,day3对应初始第四个数),但迭代方法错误地将day当成了「需要生成的后续元素个数」,导致两者返回的不是同一天的结果。 - 迭代方法循环逻辑错误:原迭代方法不管目标天数是多少,都固定生成
day个新元素,而非生成到目标天数对应的元素,这是输出不一致的主要原因。 - 递归方法边界条件冗余:原递归用多个
else if判断day0-day3,可简化为更简洁的边界判断。
修正后的代码
统一规则说明
以你提供的迭代代码逻辑为准(任务实际规则应为:当天数值 = 前一天数值 × 前三天数值 取10的余数 +1),统一day参数含义:传入day为目标天数,返回对应天数的爱好编号(day0-day3返回初始值,day4及以后按规则生成)。
修正后的递归方法
public static int chooseHobbyRecursive(int[] startNumbers, int day) { if (day < 0) { throw new IllegalArgumentException("Day cannot be negative"); } // 边界条件:day0-day3直接返回初始值 if (day < startNumbers.length) { return startNumbers[day]; } // 递归计算:当前day = (day-1的值 × day-3的值) %10 +1 int prevDay = chooseHobbyRecursive(startNumbers, day - 1); int threeDaysAgo = chooseHobbyRecursive(startNumbers, day - 3); return (prevDay * threeDaysAgo) % 10 + 1; }
修正后的迭代方法
public static int chooseHobbyIterative(int[] startNumbers, int day) { if (day < 0 || day >= startNumbers.length && startNumbers.length ==0) { throw new IllegalArgumentException("Invalid day value"); } List<Integer> numbers = new ArrayList<>(); // 初始化初始四天的数值 for (int num : startNumbers) { numbers.add(num); } // 仅生成到目标天数(day>3时才需要生成) for (int d = 4; d <= day; d++) { int prevDay = numbers.get(d - 1); int threeDaysAgo = numbers.get(d - 3); numbers.add((prevDay * threeDaysAgo) % 10 + 1); } return numbers.get(day); }
验证示例
用你提到的初始数组[21,1,20,23]测试:
- day1:递归/迭代均返回1
- day2:递归/迭代均返回20
- day5:递归/迭代均返回1
- day15:两者会返回相同的数值(经计算为3)
额外注意事项
- 若任务规则确实是你描述的「前一天和前两天」,只需将两个方法中的
day-3改为day-2即可。 - 原代码的
ArrayIndexOutOfBoundsException是因为错误的索引计算逻辑,修正后的迭代方法通过按目标天数生成元素,避免了越界问题。
内容的提问来源于stack exchange,提问作者Annika
相关产品推荐
相关产品推荐

