Почему рекурсия так работает?
let list = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
function printReverseList(list) {
if (list.next) {
printReverseList(list.next);
}
alert(list.value);
}
printReverseList(list);
Я понимаю как он выводит последний элемент. Но как он выводит предпоследние элементы ?
Ответы (1 шт):
Автор решения: Алексей Шиманский
→ Ссылка
У вас функция устроена как:
if (list.next) {
printReverseList(list.next);
}
alert(list.value);
- Если соблюдается условие - выполнить инструкции в блоке
{} - Независимо от того, выполнилось ли условие, в любом случае выполнить
alert(list.value);
Вот и всё. Обычное чтение инструкций сверху вниз. Поэтому независимо на сколько глубоко закопается рекурсия, после того, как отработают все инструкции в самом последнем блоке if самой последней вложенности, код продолжит выполняться дальше и выполнит один alert затем функция закончится и курсор выйдет из функции и выполнится другой alert, затем функция закончится и курсор выйдет из функции и выполнится другой alert, затем.....
Схематично получилось так:
if (list.next) { -----------------------------------------|
if (list.next) { --------------------------------| |
if (list.next) { -----------------------| | |
if (list.next) { ---------------| | | |
if (list.next) { | | | |
// выполнили ----| | | | |
} | | | | |
| | | | |
alert(list.value); <-| | | | |
} | ------| | | |
| | | |
alert(list.value); <-| | | |
} | ----------| | |
| | |
alert(list.value); <-| | |
} | ----------------| |
| |
alert(list.value); <-| |
} | ---------------------|
|
alert(list.value); <-|