Как работает поток управления для нескольких рекурсивных функций - PullRequest
0 голосов
/ 08 мая 2019

Мне всегда было трудно понять, когда они являются множественными рекурсивными функциями внутри тела функции. Давайте рассмотрим пример сортировки слиянием.

array = [2,4,5,6,7]
function mergeSort(array, left, right){ 
  if(left < right){
    mid = left + (right - left)/2;
    mergeSort(array, left, mid);
    mergeSort(array, mid+1, right);
    // rest of code
    ...
 }

Во-первых, я знаю, как работает стек вызовов функций. Здесь первая сортировка слиянием будет называть себя таким образом.

Стек вызовов функций для первой сортировки слиянием.

  • mergeSort (массив, 0,1);

  • mergeSort (массив, 0,2)

    Я не могу понять, как будет работать вторая сортировка слиянием. Хотя, когда я регистрирую результаты, он возвращает следующее.

  • mergeSort (массив, 3,4)

  • mergeSort (массив, 3,5);

Я делаю это в Javascript
Поэтому, если мы возьмем однопоточную среду, такую ​​как в javascript, она будет отслеживать несколько значений, как в этом случае. Как вызывается mergeSort (array, 0,2), элемент управления должен снова перетекать в ту же функцию, а значение left и right должно быть потеряно для второй функции рекурсивного слияния, расположенной под ней, но каким-то образом вторая рекурсивная функция получает значение left = 3 и справа = 5. Так что две функции работают параллельно.

Вкратце, как среда выполнения отслеживает множество значений слева и справа.

...