2017-02-08 3 views
1

Я не могу понять, как эта рекурсия будет работать. В частности, я не могу получить четкое представление о том, как выполняется последний console ('end' ---). Просьба дать указания. Пожалуйста, помогите мне в части исполнения. Я не понимание того, как он образует выходной сигналРекурсия JavaScript, понимая подробно

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

 
foo(3);

+0

я не могу понять, когда и как console.log ('end:' + i). Я был бы очень признателен. Заранее спасибо. – Hemant

+0

Если вы хотите добавить дополнительные разъяснения к своему вопросу, вы можете [изменить] его. –

+1

Если у вас возникли проблемы с визуализацией работы рекурсии, нарисуйте дерево, чтобы помочь, помните, что 'i' - это копия переменной, а не одна, поэтому вызов' foo (i-1) 'не изменится значение i для вызова 'console.log ('end:' + i);' –

ответ

2

первой итерации: Foo (3) таким образом, я = 3, то Foo (2) называется, я = 2, то я = 1 и i = 0. Теперь вызывается foo (-1). Условие if теперь истинно, поэтому оно возвращается в вызове foo (0), где console.log выполняется с i = 0. Тогда i = 1, i = 2, i = 3.

Таким образом, вы будете иметь:

begin 3 
begin 2 
begin 1 
begin 0 
end 0 
end 1 
end 2 
end 3 
+0

Я понимаю, что частично выше вызова, что я не понял из объяснения, все равно, как console.log ('end' + i) Выполнение, я новичок в javascript, но все же думаю, что он никогда не будет выполнен. я ошибаюсь, но я все еще не понимаю. – Hemant

+0

Вы ошибаетесь. рассмотрим это: foo (3) печатает «begin 3», затем он вызывает foo (2). Это означает, что foo (3) все еще не заканчивается! foo (3) все еще не возвращается! так что теперь его foo (2) выполняется, а затем foo (1) и т. д., так как условие становится истинным! когда это правда, поэтому, когда (1 <0) тогда и только тогда возвращается foo()! это означает, что foo (-1) возвращается и возвращается к foo (0), а затем выполняется последняя команда, затем foo (1) и т. д. foo (3) – mychemicalro

+0

Спасибо, я понимаю немного сейчас. – Hemant

1

Когда вы звоните foo(3), что мы видим это:

begin: 3 
begin: 2 
begin: 1 
begin: 0 
end: 0 
end: 1 
end: 2 
end: 3 

, что происходит в коде это:

begin: 3 
//foo is called, foo(2) 
//start of foo(2) 
begin: 2 
//foo is called, foo(1) 
//start of foo(1) 
begin: 1 
//foo is called, foo(0) 
//start of foo(0) 
begin: 0 
//foo is called, foo(-1) 
//start of foo(-1) 
//if statement condition is true, returns, ending the recursion chain 
//thread returns back to the foo(0) method, logs i 
end: 0 
//thread returns back to the foo(1) method, logs i 
end: 1 
//thread returns back to the foo(2) method, logs i 
end: 2 
//thread returns back to the foo(3) method, logs i 
end: 3 
+0

Я до сих пор не понял, как поток возвращается к foo (0) и концу печати: 0 – Hemant

+0

не думает о вызове foo, как о том, что это конец метода, когда вы вызываете foo, это то же самое, что и вызывающая консоль .log, он выполняет операцию, назначенную 'console.log', а затем выполняет следующий фрагмент кода. в этом случае он называет себя. действительно работают через это, как вы думаете, компьютер будет делать это, и вы получите его –

4

Объяснение как эта функция выполняет:

Давайте проследим, что происходит, когда вы вызываете этот метод и передать 3 в качестве аргумента:

foo(3); 
// (3<0) false, so skip the return 
// Log out: 'begin: 3' 
    //foo (2); 
    // (2<0) skip return; 
    // Log out: 'begin: 2' 
    //foo(1); 
     // (1<0) skip return; 
     // Log out: 'begin: 1' 
     //foo(0); 
     // (0<0) false, skip return; 
     // Log out: 'begin: 0' 
     //foo(-1); 
     //(-1 < 0) true!!! 
     //return undefined 
     // Log out: 'end: 0' 
     //return undefined 
    //Log out: 'end: 1' 
    //return undefined 
    //Log out: 'end: 2' 
    //return undefined 
//Log out: 'end: 3' 
<---return undefined 

Фактический выход:

begin: 3 
begin: 2 
begin: 1 
begin: 0 
end: 0 
end: 1 
end: 2 
end: 3 
undefined 
Смежные вопросы