Я пытался написать рекурсивную функцию Аккермана на Java. Но я думаю, что я где-то ошибся! Может ли кто-нибудь взглянуть, проверить и, возможно, указать мне правильное направление исправления моего кода? Спасибо!
Проблема с кодом заключается в том, что после того, как я написал его, я подумал, что если n == 0 и m == 0, то для этого нет области? Подпадает ли это под if (m == 0) или ему нужен собственный оператор if?
Правильно ли мое следующее решение? Если я даю ему одинаковые числа в разной последовательности, это дает другой результат, и я не уверен, так ли это.
public static int ackermann(int m, int n) {
if (m == 0) {
return n + 1;
} else if ((m > 0) && (n == 0)) {
return ackermann(m-1, n);
} else if ((m > 0) && (n > 0)) {
return ackermann(m-1, ackermann(m,n-1));
} else {
return 0;
}
}
Я подумал об этом еще немного и думаю, что пошел еще дальше не так. Если вы не можете понять, что я сделал, я дал каждому оператору if противоположность, потому что я думал, что если значения m и n заданы по-разному, будет работать следующий код. Это явно не так, но кто-то может попытаться объяснить, где я ошибся?
public static int ackermann(int m, int n) {
if (m == 0) {
return n + 1;
} else if (n == 0) {
return m + 1;
} else if ((m > 0) && (n == 0)) {
return ackermann(m-1, n);
} else if ((n > 0) && (m == 0)) {
return ackermann(n-1, m);
} else if ((m > 0) && (n > 0)) {
return ackermann(m-1, ackermann(m,n-1));
} else if ((n > 0) && (m > 0)) {
return ackermann(n-1, ackermann(n, m-1));
} else {
return 0;
}
}