2017-06-08 27 views
0

この再帰関数で何が起こっているのか理解できません。 なぜy ===未定義ですか?再帰関数で関数が未定義に戻る理由を理解しようとしています

function f(num){ 
    if(num !== 10){ 
    f(num + 1); 
    } else { 
    return num; 
    } 

} 

var y = f(0); 
console.log(y); 

私は右のその返された値の前に "NUM" をログインした場合は、ここでは10 ですjsfiddleです: https://jsfiddle.net/

+3

に到達したとき以外は何も返さない' F(NUM + 1) ' – Pointy

+1

とき'あなたの関数は何も返さないのでnum!== 10'は 'true'です。 'return'ステートメントはありません===は' undefined'を返します。 –

+0

'f(num + 1)' –

答えて

2

numが10でない場合は、あなただけもう一度fを呼び出します。 fから返された値はどこにも割り当てられません。その値を返すべきです。

function f(num){ 
    if(num !== 10){ 
    return f(num + 1); //you were returning nothing except when num reached 10 
    } else { 
    return num; 
    } 

} 

var y = f(0); 
console.log(y); 
+0

ありがとうございました。あなたはリターンがどのように働くかを詳述できますか?関数から関数が返された場合、fはどのようにして再度呼び出されますか?私は値を保持するために戻る必要があることを理解していますが、返されてからfがどのように呼び出されるかはわかりません。 – CW1

+0

@ CW1 f0はf1を呼び出し、f2をf10と呼びます。 'y'にf(0)の値を設定します。したがって、 'y'はf(0)が返す値を持ちます。 0!== 10なので、f(0)はf(1)を呼び出します。 f(0)はf(1)を呼び出すため、 'y' *はf(1)の値を格納する必要があります。 'y = f(0);'が示すように、f(0)は値が 'y'に代入されるように値を返さなければなりません。だから、f(0)の中でこれが起こるとしましょう: 'var t = f(1); return t; '。 't'はf(1)の値を取得し、それを返します。同じことがf(1)で起こり、f(2)の値が返されます。 f(10)は関数を呼び出さず、10を返します。['var t = f(1); return t; '<=>' return f(1) '] –

+0

@ CW1それでも意味をなさないのであれば、もう理解していないことを説明してください。 –

1

ブロックの場合は、内側にf(num + 1)を返す必要があります。 はこれがなければ、それは「numは」あなたはラインで `return`を逃している10

function f(num){ 
     if(num !== 10){ 
     return f(num + 1); 
     } else { 
     return num; 
     } 
    } 
var y = f(0); 
console.log(y); 
// 10 
関連する問題