2017-02-17 52 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)? –