如果在函數中只有一個遞歸調用,我可以很容易地理解遞歸。但是,當我在同一個函數中看到兩個或多個遞歸調用時,我真的感到困惑。例如:瞭解雙遞歸
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都減半。我只是不明白下一個遞歸調用的工作原理。它變得混亂和我的理解,直到這一點崩潰,我放棄了。我會非常感激,如果有人可以請用一個整潔的例子手動說明。我已經做了編程,並打印輸出。但是,我不明白這項工作背後的計算方式。這是我的理解,直到這裏的一切變得不了了之點:
INT一個[] = {} 1,2,10,15,16,4,8
初始呼叫:MaximumElement(一,0, 7)
的功能開始: 第一次調用:MaximumElement(A,0,7/2) ñ現在變爲7/2 = 3
第二個呼叫:MaximumElement(2,0,3/2) n現在變成3/2 = 1
基本con第二次遞歸調用以索引0開始,並且n =索引+ n/2 = 0 + 1/2 = 0這是第二次遞歸調用從索引0開始並且n =索引+ 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;
}
}
真的很明確的解釋!我想我現在明白了,我可以開始嘗試去理解其他的分而治之算法。非常感謝雷! –
@Ray Toal +1對我也有幫助。謝謝雷! –