2016-07-12 2 views
0

Я немного смущен на точной временной шкале выполнения, в которой выполняется следующая функция. Я видел этот код на направляющем MDN:Понимание того, как работает рекурсивная функция в javascript

function foo (i) { 
    if (i<0) return; 
    console.log('begin' + i); 
    foo(i-1); 
    console.log('end' + i); 
} 

на основе моих знаний о том, как работают функции, это то, что я думал, что мое знание неадекватное:

Я думаю, что когда функция foo(3) называется, он перейдет к функции и проверит условие if i < 0, затем он запустит следующий код console.log('begin:' + i).

После этого выполняется следующая строка кода, так как выполнение JavaScript выполняется по строке, будет выполнена следующая строка кода, которая равна foo(i-1).

Требуется значение i, которое равно 3 минус 1, поэтому вызывается foo(2) и исполнение продолжается.


Мой вопрос: Правильно ли я понимаю?. Если нет, пожалуйста, объясните, что делает этот код, иначе кто-нибудь может объяснить вкратце, когда функция перестанет быть вызванной?

+3

Итак, что * делает * это сделать, и то, что вы смущены около? – deceze

+0

'Foo (3)' начинается 3 начинаются 2 начинаются 1 начинают 0 конца 0 конец 1 конца 2 конца 3 – BNilsou

+1

Из вашего описания вы ** у ** понять, как работает эта рекурсивная функция! – Jamiec

ответ

2

Что происходит, когда вы звоните foo(3) выглядит следующим образом (в псевдокод):

execute foo(3) 
    3 is greater than 0 thus log(begin 3) 
    execute foo(2) 
     2 is greater than 0 thus log(begin 2) 
     execute foo(1) 
      1 is greater than 0 thus log(begin 1) 
      execute foo(0) 
       0 is equal to 0 thus log(begin 0) 
       execute foo(-1) 
        -1 is less than 0 thus return 
       log(end 0) 
      log(end 1) 
     log(end 2) 
    log(end 3) 
return 
+0

pls log (конец 0) log (конец 1) журнал (конец 2) журнал (конец 3) возврат каких условий привело к печати из них. – pedroyanky

+0

@pedroyanky никаких условий не привело к этим. Когда функция, которая вызывается перед ними (например, 'foo (0)'), возвращается, вызывающая функция возобновит выполнение, чтобы она запускала следующую строку кода, которая является 'log (end ...)'. Подумайте о вызове 'foo (number)' внутри функции 'foo()' как более узкой строке кода, которая может быть чем-то еще (например, одна строка, например 'console.log ('')'. Надеюсь, это поможет вам понять, как работает рекурсия! –

1

Это работает так:

foo(3)-> 

if (3 < 0) 
    return 
console.log('begin' + 3) 
if (2 < 0) 
    return 
console.log('begin' + 2) 
if (1 < 0) 
    return 
console.log('begin' + 1) 
if (0 < 0) 
    return 
console.log('begin' + 0) 
if (-1 < 0) 
    return 
console.log('end' + 0) 
console.log('end' + 1) 
console.log('end' + 2) 
console.log('end' + 3) 
Смежные вопросы