2016-08-14 3 views
-1

Я понимаю логику рекурсии, функция вызывает функцию с базовым аргументом, а затем завершает работу, то, что у меня есть здесь, это код, который регистрирует простую рекурсию, чего я не получаю, это запуск регистрации с достигнутым условием, условие выполнено: 0?Как рекурсия работает за кулисами стека вызовов?

function factorialize(num) { 

    if(num === 0){ 
     console.log('condition met: '+num); 
     return 1; 
    } 

    var x = factorialize(num-1); // iterate 
    var toReturn = num*x; 

    console.log("Current call: num = " + num 
      + " x = " + x 
      + "\n" 
      + "Returning " + toReturn 
      ); 

    return toReturn; 

} 

factorialize(5); 

Я ожидал, что этот код будет регистрировать выход первым и, наконец, условие достигнуто?

выход и demo output

+0

* Чтобы понять рекурсию, вам нужно сначала понять рекурсию * ** посмеивается ** – vaxquis

+0

, почему он первым зарегистрировал базовый футляр? @vaxquis – learningjavascriptks

+1

потому что 'factorialize (5)' вызывает 'factorialize (4)', который вызывает 'factorialize (3)', который вызывает 'factorialize (2)', который вызывает 'factorialize (1)', который вызывает 'factorialize (0) '? – vaxquis

ответ

0

В already pointed out, это

потому factorialize (5) вызывает factorialize (4), который вызывает factorialize (3), который вызывает factorialize (2), который вызывает factorialize (1), который вызывает factorialize (0)

И затем все журналы.

+0

можете ли вы подробнее рассказать о стеке вызовов? Я был в замешательстве с моим выходом, в самом низу, он регистрирует возврат 120. так что он вернул 120, но почему это условие выполняется в самой первой строке в журнале? – learningjavascriptks

+0

Когда код запускается, он вводит эту функцию в первый раз. Проверьте, будет ли он возвращать false и приостанавливает выполнение функции, чтобы ввести ее второй раз ... И так далее, пока последний вызов не выведет ваше «условие выполнено», и оно завершает функцию и продолжается от последнего вызова функции, чтобы закончить ее , поэтому он печатает следующий журнал и снова продолжает последний вызов функции и печатает снова, пока выполнение не завершится – Yitzchak

+1

@vaxquis спасибо за редактирование – Yitzchak

1

В рекурсии, сначала вы идете «в», затем вы «выходите».

Все, что требуется до рекурсивного вызова factorialize, находится в пути «в».

Все, что после него «в пути».

Поскольку ваш второй оператор console.log приходит после рекурсивного вызова, он выполняется по пути «вне».

Ваш первый оператор console.log находится внутри заявления if. Оператор if приходит перед рекурсивным вызовом, поэтому он тестируется на каждом уровне по пути «в», но он делает только заявление console.log, когда он прибывает на нижний .

Смежные вопросы