Я некоторое время не встречался с алгоритмами и начал пересматривать мои концепции в наши дни. К моему удивлению, последнее, что я помню о навыках рекурсии, состояло в том, что я был в этом хорош, но не больше. Итак, у меня есть основной вопрос для вас, ребята, который меня путает. Сначала см. Ниже код.
private void mergesort(int low, int high) {
if (low < high) {
int middle = (low + high)/2 ;
System.out .println ("Before the 1st Call");
mergesort(low, middle);
System.out .println ("After the 1st Call");
mergesort(middle+1, high);
System.out .println ("After the 2nd Call");
merge(low, middle, high);
}
}
Вызов функции
mergesort(0,7);
И вывод
Перед первым звонком
Перед первым звонком
Перед первым звонком
После первого звонка
После второго вызова
После первого звонка
Перед первым звонком
После первого звонка
После второго вызова
После второго вызова
После первого звонка
Перед первым звонком
Перед первым звонком
После первого звонка
После второго вызова
После первого звонка
Перед первым звонком
После первого звонка
После второго вызова
После второго вызова
После второго вызова
То, что меня смущает в приведенном выше коде, и результат - второй рекурсивный вызов. Я понимаю поток до четвертой выходной линии (т.е. После первого вызова). Но я не могу понять, почему он выводит (после второго вызова) после (после первого звонка). В соответствии с тем, что я понимаю из кода. После выхода (после первого вызова) должна быть вызвана функция mergesort с параметром (средний + 1, высокий) и должна выводиться (до 1-го звонка) и переходить в рекурсивный вызов с помощью объединения (низкий, средний). Я совместим с одними рекурсивными функциями вызова и понимаю и синхронизируюсь с предыдущим примером фибоначчи.