2016-06-26 7 views
2

これは本の例です。関数は、偶数の場合はTRUEを返し、偶数の場合はFALSEを返します。私はそれがどのように動作するのか分かりません。 "偶数" この関数はどこから値を取得しますか?

  • xは42
  • Xを= Nに結合する機能= 0
  • "他"
  • 開始のn
  • の作成に

    1. 42バインドを:!これは私が理解されます
    2. 「奇数」関数を作成する
    3. 奇数(42-1)
    4. "!even(41)"を開始します。

    JSは「偶数(41)」で何をしていますか? TRUEはどこから来ますか?私が理解方法は、それは、x === 0

    document.write(
     
        ((n) => { 
     
        const even = (x) => { 
     
         if (x === 0) return true; 
     
         else { 
     
         const odd = (y) => !even(y); 
     
         return odd(x - 1); 
     
         } 
     
        } 
     
        return even(n) 
     
        })(42) 
     
    )

  • +1

    これは再帰関数です。 'x === 0'は基本ケースです。 – elclanrs

    +0

    @elclanrsはTRUEで、42から来ていますか?理解できません –

    +0

    1を最初に実行してから2にしてから約42を推論してみてください。 –

    答えて

    3

    は、それが意図的に混乱だ場合にのみ、TRUEを返す必要があります。ロジックに従います。

    nが0でない場合、奇数を呼び出し、偶数のブール値を反転するoddという新しい関数を作成します。

    次に、は、関数をn-1と呼びます。

    本質的に、whileループのように、数字から1を減算し、0になるまで真理性や偽りを各ステップでより深く反転させます。関数が偶数回呼び出されると、偶数回。それが奇数回と呼ばれると、それは奇妙です。

    +3

    意図的に混乱させることに加えて、偶数か奇数かをチェックするのに非常に非効率的な方法です。私は再帰を示すことを意図していると仮定していますが、それはあまりうまくいきません... – rockerest

    +0

    同意して、ちょうどOPに同じコメントをしました。 – Paul

    +1

    私は混乱している部分は、 'odd'は' else'ブロックのスコープの内側で宣言されているということです - 同じレベルであればもっと鮮明になります。それが本当に意図的だったかどうかは疑問に思う。 – Bergi

    0

    次のコードは、再帰の使用を含む本の例と同じロジックを実行しますが、isEvenが整数でないか負の値で呼び出された場合は無限ループを防ぎます。

    const isEven = (n) => 
    { 
        const even = (x) => x ? !even(x-1) : true; 
    
        return even(Math.abs(Math.floor(n))); 
    } 
    isEven(42) 
    

    は今ベンチロジックテストはかなり単純です:

    even(0) returns true; 
    even(1) returns !even(1-1), which is !even(0), which is false; 
    even(2) returns !even(2-1), which is !even(1), which is true; 
    

    などで高い数値のため。パラメータ値の各インクリメントは偶数への再帰呼び出しを実行します。偶数呼び出しは、偶数としてハードコードされたゼロに達するまで、その下位の数字の「偶数」を補完します。

    最終結果は、evenが偶数回(偶数の場合)呼び出された場合、isEventrueを返します。 evenが偶数回(奇数の場合)呼び出された場合、isEvenはfalseを返します。

    関連する問題