Ваша последняя троичная операция не имеет третьего операнда.
(m>0 && n>0)? ackermann(m-1, ackermann(m,n-1));
Обратите внимание, что есть ?
, но нет :
.
Поскольку вы охватили все случаи, вы можете изменить это на возврат -1 или выдать исключение.
Однако вы можете также реализовать эту функцию более читабельно, не используя тернарный оператор:
public static long ackermann(long m, long n) {
if (m == 0) {
return n+1;
}
if (m > 0 && n == 0) {
return ackermann(m-1, 1);
}
if (m > 0 && n > 0) {
return ackermann(m-1, ackermann(m, n-1));
}
// Something went wrong
System.out.println("Invalid inputs: m and n cannot be negative");
return -1;
}
Больше строк кода не обязательно плохо, а код гольфа не обязательно хорошо. Напишите свой код таким образом, чтобы вы могли вернуться к нему через год и легко понять, для чего он предназначен.