Понимание того, как метод вызывается

1

Может кто-то объяснит, как работает рекурсия. Я попытался понять, записывая низкий, средний, высокий при каждом рекурсивном вызове. Но я, кажется, что-то ошибаюсь. Может кто-нибудь, пожалуйста, покажите мне шаги. понять, где значения возвращаются в

if(leftmax>rightmax){
    return leftmax;
}
else
    return rightmax;

Здесь код:

public class Maximum{
    public static  int max(int[] a,int low,int high){
        int mid,leftmax,rightmax;
        if(low==high)
            return a[low];
        else{
            mid=(low+high)/2;
            leftmax=max(a,low,mid);
            rightmax=max(a,mid+1,high);
            if(leftmax>rightmax){
                return leftmax;}
            else
                return rightmax;            
        }
    }

    public static void main (String args[]){
        int[] a={32,8,12};
        System.out.println(max(a,0,2));
    }
}
  • 0
    @ Джим Гаррисон: я понимаю, что происходит на этот другой вопрос. Но этот я не могу понять,
  • 0
    ОК, я снова открыл это. Я предлагаю вам проследить это с помощью отладчика, шаг за шагом.
Показать ещё 1 комментарий
Теги:
recursion

2 ответа

1

Таким образом, похоже, что это известный алгоритм Divide и Conquer для нахождения элемента, в данном случае максимального элемента.

Метод начинается с этого ввода:

max(int[] a, int low, int hight)

a[] = { 32, 8, 12 }; //The target array. You want to find the maximum element in it.
low = 0; //The index of the array where you will start searching
high = 2; //The index of the array where you will stop searching

Таким образом, в основном, низкий и высокий определяет "диапазон", вы будете искать максимальный уровень в этом диапазоне, если вы хотите искать весь массив, тогда вы указываете диапазон как индекс 0 и максимально возможный индекс, то есть длина массива - 1 (помните, индекс начинается с нуля, поэтому вам нужно вычесть смещение)

Первое условие в методе проверяет, дал ли вам диапазон с одним элементом. В этом случае низкие и высокие будут одинаковыми, потому что они относятся к одному и тому же индексу в массиве. Поэтому вы просто возвращаете этот конкретный элемент в индекс (вам не нужно выполнять поиск, если вы ищете максимальный элемент в одноэлементном диапазоне, то максимальным элементом является тот единственный элемент). Возврат [низкий] или [высокий] - то же самое.

Если вы дали диапазон с более чем одним элементом, вы переходите в раздел else.

Здесь вы получаете средний индекс диапазона.

Итак, если вы указали диапазон от индекса 3 (низкий) до индекса 7 (высокий), то средний индекс будет равен 5.
(* (низкий + высокий)/2 *)

Затем вы разбиваете диапазон на два диапазона, левый диапазон и правый диапазон, оба они исходят из того же исходного диапазона, который был разделен двумя.

Затем вы выполняете все вышеперечисленные операции, которые я изложил, с каждым из этих двух диапазонов, пока в той же точке вы не разделите так много диапазонов, что вы получите одноэлементный диапазон и вернете его.

Остановитесь здесь на секунду.

Посмотрите на код, мы сохраняем возвращаемые значения разделенных диапазонов в leftmax и rightmax соответственно, но так как вы вызываете один и тот же метод, у каждого разделенного диапазона также будут свои собственные leftmax и rightmax и собственные диапазоны.

Это похоже на то, что вы ныряете глубже и глубже, поверхность - это первоначальное выполнение метода.

Последний уровень глубины дает одноэлементный диапазон (результат предыдущего раскола). В этом случае метод перестанет называть себя, потому что он действительно вернет значение. Кто поймает это возвращенное значение? На предыдущем уровне, который также может быть очень глубоким, этот глубокий уровень будет захватывать возвращаемые значения последнего уровня и выполнять сравнение в коде, возвращающее максимальный элемент, и возвращает максимальный элемент этих двух чисел в выше уровня, который будет делать то же самое, и вернет его на более высокий уровень, и дальше и дальше, пока вы не достигнете уровня поверхности, с двумя максимальными номерами каждого разделенного массива соответственно, тогда вы проверите максимум этих два числа и вернуть их вам (вы - самый высокий уровень!).

Надеюсь, я объяснил весь процесс и помог вам!

0
1    low=0 high=2 mid=1 
2        low=0 high=1 mid=0
3            low=0 high=0 --> return a[0] --> leftmax == 32
4            low=1 high=1 --> return a[1] --> rightmax == 8
             leftmax > rightmax --> return leftmax == 32
5        low=2 high=2 --> return a[2] --> rightmax == 12
         leftmax > rightmax --> return leftmax == 32

Задача функции max():

  • Если low и high равны, верните значение, на которое указывает индекс
  • В противном случае разделите раздел массива, который мы рассмотрим на два сегмента, и вызовите max() рекурсивно на обе половины. Затем верните больше значений, возвращаемых двумя вызовами.
  • 0
    Я не понимаю несколько этапов. До шага я понимаю. До шага 4 низкий = 0, высокий = 0. Затем значение 32 возвращается влево max. Затем выполняется строка rightmax=max(a,mid+1,high); . Так как ранее низкий = высокий = 0, средний = 0. Тогда это будет rightmax = max (a, 1,0). Затем rightmax = max (a, 1,1). Это возвращает a [1] = 8 как rightmax , Затем, так как leftmax> rightmax, leftmax из 32 возвращается в WHERE? Это для leftmax = (a, 0,1)? Тогда как он переходит к шагу 5? В какой строке он становится низким = 2 высоким = 2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню