2017-02-17 105 views
1

這是合併排序方法:這個遞歸函數的答案是什麼?

private void doMergeSort(int lowerIndex, int higherIndex) { 

     if (lowerIndex < higherIndex) { 

     int middle = lowerIndex + (higherIndex - lowerIndex)/2; 

     System.out.println("Lower index="+lowerIndex+" Middle="+middle+ " Higher index="+higherIndex); 

     doMergeSort(lowerIndex, middle); 

     doMergeSort(middle + 1, higherIndex); 

     mergeParts(lowerIndex, middle, higherIndex);//never mind this method 
    } 
} 

爲doMergeSort輸出(0,9)作爲如下:

Lower index=0 Middle=4 Higher index=9 
    Lower index=0 Middle=2 Higher index=4 
    Lower index=0 Middle=1 Higher index=2 
    Lower index=0 Middle=0 Higher index=1 
    Lower index=3 Middle=3 Higher index=4//This line 
    Lower index=5 Middle=7 Higher index=9 
    Lower index=5 Middle=6 Higher index=7 
    Lower index=5 Middle=5 Higher index=6 
    Lower index=8 Middle=8 Higher index=9 
    4 11 23 28 43 45 65 77 89 98 //never mind this part too 

怎麼沒輸出的4號線(如標註與評論)成立?請解釋。

+0

這是一個從''doMergeSort由第二遞歸調用(0,4)'':中間的計算公式爲2,那麼您撥打電話(0,2)和(3,4)。爲什麼你有這個問題? – jasonharper

+0

您是否有問題單步執行代碼?如果您在println處放置了一個斷點,則可以在打印該特定行時看到遞歸的調用堆棧。 –

+0

@jasonharper那麼這是否意味着函數doMergeSort(0,4)和doMergeSort(3,4)同時執行? –

回答

1

下面是代碼控制流程的圖示,它可以幫助您清除疑問。

enter image description here

+0

我明白了,但爲什麼不func(5,9)作爲func(0,4)的兄弟執行? –