Я пытаюсь написать 3-х входную рекурсивную программу для max и min для класса структур данных. Я получаю ошибку. Я не могу сказать, уйду ли я с конца массива, но я не должен быть так далеко, насколько я понимаю. Любая помощь будет оценена по достоинству. Вот мой код:
class Extrema {
// maxArray()
// returns the largest value in int array A
// p is position zero, r is position length-1
static int maxArray(int[] A, int p, int r) {
int q;
if (p == r) {
return A[p];
} else {
q = (p + r)/2;
return max(maxArray(A, p, q-1), maxArray(A, q+1, r));
}
}
// max()
// returns the largest value of two ints
private static int max(int a, int b) {
return a > b ? a : b;
}
// main()
public static void main(String[] args) {
int[] B = {-1, 2, 6, 3, 9, 2, -3, -2, 11, 5, 7};
System.out.println( "max = " + maxArray(B, 0, B.length-1) ); // output: max = 11
}
}
Изменить этот код
if (p == r) {
return A[p];
}
в
if (p >= r) {
return A[p];
}
и обратите внимание, что когда вы вызываете оператор
return max(maxArray(A, p, q-1), maxArray(A, q+1, r));
вы теряете элемент q, поэтому вызовите
return max(maxArray(A, p, q), maxArray(A, q+1, r));
Либо это не рекурсивно, так как рекурсия действительно не имеет никакого смысла здесь:
static int maxArray(int[] A, int p, int r) {
int max = A[p];
for (int i = p + 1; i <= r; i++) {
if (A[i] > max)
max = A[i];
}
return max;
}
Или, если вы настаиваете на какой-то рекурсии, используйте свой код, существующий только с незначительными изменениями:
return max(maxArray(A, p, q), maxArray(A, q+1, r));
Обратите внимание, что вызов первой функции maxArray теперь передается q
а не q-1
качестве конечного индекса.