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

Java递归与迭代方法计算选爱好结果不一致,求排查修正

问题分析与修正方案

核心错误点

  1. 参数含义不匹配:递归方法中day代表目标天数(day0对应初始第一个数,day3对应初始第四个数),但迭代方法错误地将day当成了「需要生成的后续元素个数」,导致两者返回的不是同一天的结果。
  2. 迭代方法循环逻辑错误:原迭代方法不管目标天数是多少,都固定生成day个新元素,而非生成到目标天数对应的元素,这是输出不一致的主要原因。
  3. 递归方法边界条件冗余:原递归用多个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)

额外注意事项

  1. 若任务规则确实是你描述的「前一天和前两天」,只需将两个方法中的day-3改为day-2即可。
  2. 原代码的ArrayIndexOutOfBoundsException是因为错误的索引计算逻辑,修正后的迭代方法通过按目标天数生成元素,避免了越界问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:59:59