Проблема с решением рекурсии

Суть - найти индекс максимального числа в массиве.

Код:

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;
    }
}
→ Ссылка