Java代码递归和迭代方法有不同的答案

问题描述 投票:0回答:1

我开始失去希望和理智...... 我正在学习Java代码并尝试编写一个程序来选择爱好,但它必须通过两种方法来完成,并且我给出不同的数字......我不知道在哪里寻找错误或如何使其正确。请帮忙!

 public static int chooseHobbyRecursive(int[] startNumbers, int day) {
    if (day == 0){
        return startNumbers [0];
    } else if (day == 1) {
        return startNumbers [1];
    } else if (day == 2) {
        return startNumbers [2];
    } else if (day == 3) {
        return startNumbers [3];
    } else {
        int prev = chooseHobbyRecursive(startNumbers, day - 1);
        int prevPrePrev = chooseHobbyRecursive(startNumbers, day - 3);
        return (prev * prevPrePrev) % 10 + 1;
    }
    }
   

    public static int chooseHobbyIterative(int[] startNumbers, int day) {
        List<Integer> numbers = new ArrayList<>();

        numbers.add(startNumbers[0]);
        numbers.add(startNumbers[1]);
        numbers.add(startNumbers[2]);
        numbers.add(startNumbers[3]);

        for (int d = 0; d < day; d++) {
            int index = d + 4; 
            int prev = numbers.get(index - 1); 
            int prePrePrev = numbers.get(index - 3); 
            numbers.add((prev * prePrePrev) % 10 + 1);
        }

        return numbers.get(numbers.size() - 1);
    }
}

我一直在尝试重写代码,但它通常要么因 ArrayIndexOutOfBoundsException 而终止,要么具有不同的数字

输出:

=== Day 1 ===
Iterative = 4 | Recursive = 1

=== Day 2 ===
Iterative = 1 | Recursive = 20

=== Day 5 ===
Iterative = 8 | Recursive = 1

=== Day 15 ===
Iterative = 2 | Recursive = 3

UPD任务指出:一开始,学生写下两个数字:他出生的日期和月份,然后写下两个数字 - 当前年份的两半。例如,如果他出生于1月21日,年份是2023年,那么前四个数字是21 1 20 23。接下来的每个数字都是通过以下规则获得的:前一天和前两天取,相乘,余数除以10,然后加1,这样就从1开始编号。每个这样的数字都是从 1 到 10,并且是他当天要做的爱好的编号。

我得到了迭代方法和创建递归方法的工作,但我不明白如何(我想出了如何制作递归部分),但不知何故不知道如何使方法 ChooseHobbyRecursive 正确。

我非常感谢您的解释或/和我错误的部分或任何建议。谢谢!

java recursion iteration
1个回答
0
投票

我的建议如下:

  1. 算前4天

  2. 向数组添加内存

  3. 检查内存数组中的单元格是否为空(!=0)

  4. 如果为空,则开始递归

    public static int choiceHobbyRecursive(int[] startNumbers, int day, int[] memory) {

     int day1 = (startNumbers[startNumbers.length - 1] * startNumbers[startNumbers.length - 3]) % 10 + 1;
     if (day == 1) {
         return day1;
     }
     int day2 = (day1 * startNumbers[startNumbers.length - 2]) % 10 + 1;
     if (day == 2) {
         return day2;
     }
     int day3 = (day2 * startNumbers[startNumbers.length - 1]) % 10 + 1;
     if (day == 3) {
         return day3;
     }
     int day4 = (day3 * day1) % 10 + 1;
     if (day == 4) {
         return day4;
     }
    
     memory[0] = day1;
     memory[1] = day2;
     memory[2] = day3;
     memory[3] = day4;
    
     if (memory[day - 1] != 0) {
         return memory[day - 1];
     }
     memory[day - 1] = (chooseHobbyRecursive(startNumbers, day - 1, memory) * chooseHobbyRecursive(startNumbers, day - 3, memory)) % 10 + 1;
     return memory[day - 1];
    

    }

© www.soinside.com 2019 - 2024. All rights reserved.