Проблема с решением рекурсии
Суть - найти индекс максимального числа в массиве.
Код:
import java.util.Scanner;
class Zhopa {
static class recurs {
public int maxInd(int[] arr, int max, int ind, int arrlen) {
int swapVal = 0;
if (arr[ind] > max) {
swapVal = ind;
max = arr[ind];
} else if (ind == arrlen - 1)
return swapVal;
if (swapVal < maxInd(arr, max, ind + 1, arrlen)) {
return maxInd(arr, max, ind + 1, arrlen);
} else return swapVal;
}
}
static class Recursion {
public static void main(String args[]) {
recurs f = new recurs();
Scanner str = new Scanner(System.in);
System.out.println("Введите размер массива: ");
int arrSize = str.nextInt();
int[] arr = new int[arrSize];
int arrlen = arr.length;
System.out.println("Введите элементы массива: ");
int j;
for (j = 0; j < arr.length; j++) {
arr[j] = str.nextInt();
}
System.out.println(f.maxInd(arr, 0, 0, arrlen));
}
}
}
Почему-то есть конфликт между длиной массива и индексацией. Заканчивается ошибкой java.lang.ArrayIndexOutOfBoundsException
Никак не получается сделать эту задачу.
Ответы (1 шт):
Автор решения: StateItPrimitive
→ Ссылка
Решение может выглядеть следующим образом:
public class Example {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Введите размер массива:");
int[] array = new int[scanner.nextInt()];
System.out.println("Введите элементы массива:");
for (int i = 0; i < array.length; i++) {
array[i] = scanner.nextInt();
}
// индексы начинаются с 0
System.out.println("Индекс максимального элемента: " + getMaxItemIndexByRecursion(array, 0));
System.out.println("Индекс максимального элемента: " + getMaxItemIndexByIteration(array, 0));
}
/**
* Мне кажется, рекурсивное решение неоптимальным для данной задачи,
* но тем не менее:
*/
private static int getMaxItemIndexByRecursion(int[] array, int startIndex) {
if (startIndex >= array.length - 1) {
return array.length - 1;
}
int maxItemIndex = getMaxItemIndexByRecursion(array, startIndex + 1);
if (array[maxItemIndex] < array[startIndex]) {
maxItemIndex = startIndex;
}
return maxItemIndex;
}
/** Банальным перебором в цикле эту задачу решать куда удобнее: */
private static int getMaxItemIndexByIteration(int[] array, int startIndex) {
int maxItemIndex = startIndex;
int maxItemValue = array[maxItemIndex];
for (int i = startIndex; i < array.length; ++i) {
if (maxItemValue < array[i]) {
maxItemIndex = i;
maxItemValue = array[maxItemIndex];
}
}
return maxItemIndex;
}
}