Итак, я просматривал код для mergesort , который использует рекурсию. Я немного запутался в том, как работает код. Поскольку путаница связана с рекурсией, я помещаю аналогичный код ниже, который значительно упрощен и фокусируется только на части рекурсии:
var index = 0;
function parent() {
console.log("parent called");
if(index < 5) {
index++;
return child(parent());
}
else return 1;
}
function child() {
console.log("child called");
}
parent();
Над выходными данными кода:
"parent called"
"parent called"
"parent called"
"parent called"
"parent called"
"parent called"
"child called"
"child called"
"child called"
"child called"
"child called"
ожидание «вызова дочернего элемента» после каждого «вызова родителя», поскольку parent
вызывает child
каждый раз, если index
не становится больше или равно 5. Таким образом, после первого вызова parent
, parent
вызывает child
, который затем вызывает parent
и так далее. Так почему же вывод показывает пять последовательных «родительских вызовов», а затем пять последовательных «дочерних вызовов»?
Я пытался понять это с помощью визуализатора для стека вызовов в JS, но я все еще не понял почему child
просто помещает parent
в стек, но сам в это время не выполняется? Вы можете увидеть это в действии здесь .