Я могу легко понять рекурсию, если внутри функции есть только один рекурсивный вызов. Однако я действительно смущаюсь, когда вижу два или более рекурсивных вызова в одной и той же функции. Пример:
int MaximumElement(int array[], int index, int n)
{
int maxval1, maxval2;
if ( n==1 ) return array[index];
maxval1 = MaximumElement(array, index, n/2);
maxval2 = MaximumElement(array, index+(n/2), n-(n/2));
if (maxval1 > maxval2)
return maxval1;
else
return maxval2;
}
Я понимаю одну вещь, что n уменьшается наполовину во время каждого рекурсивного вызова. Я просто не понимаю, как работает следующий рекурсивный вызов. Это сбивает с толку и мое понимание, пока этот момент не разваливается, и я сдаюсь. Я был бы очень благодарен, если бы кто-нибудь мог проиллюстрировать это вручную на аккуратном примере. Я уже сделал программирование и распечатал результаты. Однако я не понимаю, как работают расчеты, лежащие в основе этого. Вот мое понимание до момента, когда все сводится к нулю:
интервал [] = {1,2,10,15,16,4,8}
Первоначальный вызов: MaximumElement(a, 0, 7)
Функция начинается: Первый вызов: MaximumElement(a, 0, 7/2) n теперь становится 7/2 = 3
Второй вызов: MaximumElement(2,0,3/2) n теперь становится 3/2 = 1
Базовое условие выполнено, и max1 получает a[0] = 1
Вот где начинается ад: второй рекурсивный вызов начинается с индекса 0 и n = index + n/2 = 0 + 1/2 = 0? Когда я печатаю значения, программа показывает 3 как значение для n при выполнении второго вызова.
Я много программировал, но с этим у меня действительно кошмар. Большое спасибо тому, кто может сломать это для меня!!
Это был приведенный выше псевдокод, но см. ниже код Java, который я написал (это может облегчить вам задачу, если вы пытаетесь его запустить):
public int MAXIMUMELEMENT(int a[], int i, int n)
{
int max1, max2;
System.out.println("1: " + i + " 2: " + n);
if(n == 1)
{
System.out.println("Returning " + a[i]);
return a[i];
}
max1 = MAXIMUMELEMENT(a, i, n/2);
System.out.println("Index: "+i+" "+" Variable: "+max1+" n value: "+n);
max2 = MAXIMUMELEMENT(a, i + (n/2), n - (n/2));
System.out.println("Index2: " + i + " " + "Variable2: " + max2);
if(max1 > max2)
{
System.out.println("Returning.... " + max1 );
return max1;
}
else
{
System.out.println("Returning.... " + max2);
return max2;
}
}