2015-09-18 4 views
1

Я пытаюсь изучить рекурсию в Javascript и написал это, чтобы проследить простую рекурсивную функцию.Что это за рекурсивная функция?

function count(num){ 

console.log(num + " top"); 
if (num===5) 
return console.log("It has ended."); 
count(num+1); 
console.log(num + " bottom"); 
} 

count(1); 

Вот результат:

1 верхняя
2 верхняя
3 верхняя
4 сверху
5 сверху
Это закончилось.
4 снизу
3 снизу
2 снизу
1 снизу

Так что здесь происходит? Что-то не так с моим базовым условием? Является ли журнал показом того, что надел и снял стек? Я бы ожидал, что функция остановится на «Это закончилось», и я не уверен, почему это не так.

Спасибо.

+0

Эта функция называется несколько раз ... Она останавливается только один раз на «Это закончилось», но четыре раза это не так. – Bergi

+1

Возможно, это поможет: [Понимание того, как работают рекурсивные функции] (http://stackoverflow.com/q/25676961/1492578) –

+0

Думаю, мне, возможно, потребуется это прочитать. Рекурсия заставляет мою голову болеть, и я в основном думаю, что это волшебство. – Andy

ответ

2

Когда вы добираетесь до 5, срабатывает обратный оператор. Это означает, что 5-й раз count называется не будет еще раз вызовет count, а затем он не назовет console.log еще раз.

Когда он возвращается с 5-го вызова, он возобновляет 4-й вызов.

В 4 вызове count является 4 (count является локальным переменным и у вас есть другой по одному для каждого вызова count), поэтому он проходит окончательное console.log заявления в функции, достигает конец функции и возвращает undefined , третий вызов затем возобновляется и так далее.

+0

Спасибо. Я почти на месте. Когда вызывается 'count (num + 1)', вся функция повторяется, и именно поэтому мы видим возрастающий счет в журнале. Затем выполняется условие, и «Он закончился» регистрируется. Но что происходит, когда счетчик убывания регистрируется * после * условие выполнено? То есть, я думаю, я еще не понимаю ваши последние два абзаца. – rswerve

+0

@rswerve - Он возвращается из функции, которую он вызвал, и возобновляет выполнение предыдущей функции (которая является той же самой функцией, только с разными аргументами). – Quentin

0

Дело в том, что ваш funcion печатает сверху и снизу, если не прекращается раньше. вызов выполняется между верхним и нижним, а также возвратом.

first second third 4th  5h call of function 
1 top 
     2 top 
       3 top 
         4 top 
           5 top 
           It has ended. 
         4 bottom 
       3 bottom 
     2 bottom 
1 bottom 
Смежные вопросы