Наименьший размер кода, который я мог получить:
public class RecursiveTry {
public static void main(String[] args) {
int[] x = new int[] {1,2,4,3,3,32,100};
System.out.println(Max(x, 0));
}
public static int Max(int[] arr, int currPos) {
if (arr.length == 0) return -1;
if (currPos == arr.length) return arr[0];
int len = Max (arr, currPos + 1);
if (len < arr[currPos]) return arr[currPos];
return len;
}
}
Несколько вещей:
1 / Если массив имеет нулевой размер, он возвращает максимум -1 (у вас может быть другое значение маркера, скажем, -MAX_INT или выдается исключение). Я сделал предположение для ясности кода, чтобы предположить, что все значения равны нулю или больше. В противном случае я бы засыпал код всякими ненужными вещами (что касается ответа на вопрос).
2 / Большинство рекурсий, по моему мнению, «чище», если завершающий регистр - это «нет данных», а не «последние данные», поэтому я возвращаю значение, которое гарантированно будет меньше или равно макс. , Другие могут расходиться во мнениях, но это не первый или последний раз, когда они ошибаются: -).
3 / Рекурсивный вызов просто получает максимум остальной части списка и сравнивает его с текущим элементом, возвращая максимум двух.
4 / «Идеальным» решением было бы передать модифицированный массив при каждом рекурсивном вызове, чтобы вы сравнивали только первый элемент с остальным списком, устраняя необходимость в currPos. Но это было бы неэффективно и вызвало бы гнев SO.
5 / Это не обязательно является лучшим решением. Возможно, из-за чрезмерного использования LISP с помощью CAR, CDR и этих бесконечных скобок может быть скомпрометировано серое вещество.