2016-12-22 11 views
0

私はJavaScriptの本を読んでいます。私はこれを初めて使っているので、再帰の部分に行きました。再帰の仕組みはわかりますが、その部分は私には難しいです。部。このコードをよく理解する必要があります

これはコードです:

function isEven(n) { 
    if (n == 0) 
     return true; 
    else if (n == 1) 
     return false; 
    else if (n < 0) 
     return isEven(-n); 
    else 
     return isEven(n - 2); 

} 

は50 == 0が真であるか来る...本当の私を与える

isEven(50); 

私は値として機能50に渡す言うことができますまたは75 == 1は偽です...私は本当にそれを取得しません。

+1

コードをトレースしましたか? – Taelsin

+4

キーは関数の最後の行です。 '50 == 0'は明らかに* not *' true'なので、 'n'が' 50'であれば、最後の行に至ります。 – Pointy

+0

あなたは明らかに再帰についての部分を得ていませんでした。本のその部分に戻ってください。 –

答えて

2

この関数に50を渡すと、最後のブロック(else)に戻り、再帰的に実行されます。 return isEven(n - 2);と書くときは、isEven(48)を実行し、次にisEven(46)などを実行して、isEven(0)に到達するまで右に移動します。

これは最初のifブロックを呼び出し、出力としてtrueを取得します。 trueisEven(0)、その後にはisEven(2)が返されます(isEven(2)を実行すると、return isEven(0)になりました)、最終的にisEven(50)の出力をtrueとして返します。

2

このコードは、数字が偶数であるかどうかを確認する長い方法のようなものです。数字が奇数の場合は、最終的に1に達することになります。

したがって、数字が偶数であり、 0より大きい場合、0または1に達するまで関数に次の数値(n - 2)を返します。次に停止します。

数字が負の場合は、記号を反転して同じ処理を行います。 n == 0n == 1:基本的に、それは二つの基地のケースを持つことによって動作

return n % 2 == 0 

2

これは単にとして解決できる問題に再帰を適用する興味深い方法です。これらはどちらも「既知」なので、trueまたはfalseを返すだけです。数値が負の場合は、符号を逆にして再帰呼び出しを行います(isEven(-n))。それ以外の場合は、2を引くだけです(isEven(n - 2))。これは、奇数から2を差し引いた値がまだ奇数であり、偶数から2が偶数であるために機能します。したがって、基本ケース(n == 0またはn == 1)のいずれかに適合するまで、nから2を引きます。n

if (n == 0)   // base case 
    return true; 
else if (n == 1)  // base case 
    return false; 
else if (n < 0)  // reverse sign, call recursively 
    return isEven(-n); 
else     // default, subtracts 2, calls recursively 
    return isEven(n - 2); 
-1

あなたは%オペレータ

let isEven = n => !(n % 2); 
+3

この回答は、どのようにして再帰の動作を理解するのに役立ちますか? – Barmar

+1

元のコードの理解に問題がある場合は、賢明な1つのライナーを説明せずに導入するとは分かりません – Cruiser

+1

数字が何であるかを教えているわけではなく、再帰について学んでいます。 – Barmar

0

あなたのコードを視覚化するために、あなたがハングアップ取得している場所が表示されます。このtoolを使用を使用して機能を簡素化することができます。

コードをステップ実行するためにページが読み込まれた後に、ボタンをクリックしてからをクリックします。

関連する問題