2017-02-17 97 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)的兄弟执行? –

相关问题