Мне всегда было трудно понять, когда они являются множественными рекурсивными функциями внутри тела функции.
Давайте рассмотрим пример сортировки слиянием.
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. Так что две функции работают параллельно.
Вкратце, как среда выполнения отслеживает множество значений слева и справа.