2011-04-09 41 views
0

我努力按照這個 '所謂簡單的' 遞歸過程繼遞歸

void display(int x, int y) { 
    int[] a = {0,1,2,3}; 
    if(x==y) { 
     System.out.print(a[x]+" "); 
    } 
    else { 
    int mid=(x+y)/2; 
    display(x, mid); 
    display(mid+1, y); 
} 

第一個print語句x = 0和Y = 0和MID = 0之後 - 這我明白。下一個通話似乎是第二個通話顯示(mid + 1,y);現在突然Y = 1 - 沒有這種變化發生的地方 - 打印語句被執行,則y = 3.Obviously調試器的值不遵循這一點的最好辦法 - 我明白了什麼是在factoral例子發生,而且可以在筆和紙上遵循它 - 是否有可能看到這個例子中發生了什麼?任何幫助將不勝感激。

+2

「第一打印語句x = 0和y = 0的後」 - 僅當最初的調用是'display(0,0)'。 – 2011-04-09 01:18:05

+0

@Matt - 對不起,我的意思是在if語句正確後的第一次,我的初始調用是(0,3)。 – 2011-04-09 01:47:39

回答

0

它只是通過所有的元素會按順序使用「二進制搜索」排序算法,並打印出每個元素。我認爲結果只是指數從xy的所有元素。

注意這個詞mid是一個暗示:如果你正在做的兩件事情的平均值,得到的中間,那麼你的原始變量很可能分別startend。因此,嘗試重寫它:

void display(int start, int end) 
{ 
    int[] a = { 0, 1, 2, 3 }; 
    if (start == end) 
    { 
     System.out.print(a[start] + " "); 
    } 
    else 
    { 
     int mid = (start + end)/2; 
     display(start, mid); 
     display(mid + 1, end); 
    } 
} 

,它應該看起來更明顯:你把一半的陣列,稱自己上各佔一半,而當你的一半的長度爲1,打印在該值位置。

+0

是的,這就是它 - 我的問題是我想跟隨x,y和中間變量 - 但由於遞歸性質,我不明白爲什麼變量y突然從0跳到1,然後在if語句後跳到1到3 。 – 2011-04-09 01:25:59

+0

@Eternaly困惑:如果有幫助,嘗試「展開」功能 - 複製/粘貼裏面的遞歸調用發生在那裏的內容,使之看起來更明顯。 – Mehrdad 2011-04-09 01:29:17

+0

@Mehrdad - 謝謝你試圖幫助我理解這一點 - 我感覺有點愚蠢,必須錯過一些明顯的東西。我可以問你我是否正確解釋 - – 2011-04-09 01:52:58

2

你應該嘗試打印xymid開始你的函數

你也可以複製粘貼,作爲@Mehrdad建議,或畫一棵樹(二叉樹,因爲每個調用導致恰好爲0或2個呼叫)。

劇透:

   (0,[1],3) 
      /  \ 
    (0,[0],1)   (2,[2],3) 
/  \  /  \ 
(0,0)  (1,1) (2,2)  (3,3) 

-

我最初寫沿此線的東西,然後想你可能不需要它。現在,我覺得你這樣做:

xy是參數的功能。因此,每個調用將擁有自己的獨立xy。在這種情況下,將會有7 x s和7 y s(請檢查樹)。

至於「跳」,它原來是太難爲我解釋,抱歉,但它的,簡單地說:樹結束和另一個開始的一個分支。 (因此,當端部(1,1)(0,[0],1)也結束和(0,[1],3)使得其第二呼叫,(2,[2],3) - 這是在「跳」爲1至3)

+0

這使得如此現在更有意義了!非常感謝。 – 2011-04-09 04:35:42