2017-02-08 7 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) 'への呼び出しは変更されないことを覚えておいてください'console.log( 'end:' + i);の呼び出しのためのiの値 –

答えて

2

最初の反復:FOO(3)ので、私は= 3、その後、fooは(2)と呼ばれ、I = 2、その後、I = 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)then then 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)とprint endに戻る方法を理解していませんでした:0 – Hemant

+0

fooを呼び出すと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