2
const res = (n => { 
    const even = x => { 
    if (x === 0) 
     return true 
    else { 
     const odd = y => !even(y) 
     return odd(x - 1) 
    } 
    } 
    return even(n) 
})(42) 

console.log(res) //=> true 

42がparamtersで使われていますが、xが0で厳密に型と値が等しい場合にのみtrueを返すと言われていますが、なぜ真が返されるのかわかりません。私は0以外の値はfalseと返すべきだと思った。誰かが私にこれを説明してください、私は非常にjavascriptとプログラミングに新しいですか?なぜこの関数はtrueを返しますか?

+0

それがtrueを返した後、0に達するまで、機能は1を引いをループされます。ここでは仕事場でそれを見ることができます:https://repl.it/KRZa – Baruch

+0

@Baruch '43'ではどうなりますか? https://repl.it/KRZa – sabithpocker

+1

数字が偶数であるかどうかを確認するには、これは非実用的で非効率的な方法です。実際に*使用する予定がある場合は、このコードを書かないでください。 – user2407038

答えて

6

ローカル関数とIIFEですべての不要な部分を削除すると、ゼロのテストだけが得られます。それは、偶数の値か、値が1だけ減っていない再帰的な呼び出しです。

const even = x => x === 0 || !even(x - 1); 
 

 
console.log(even(42)) // true 
 
console.log(even(43)) // false

いただきましeven

n result of calling simplified 
-- ----------------- ---------- 
8 !even(7)   !even(7) 
7 !!even(6)   even(6) 
6 !!!even(5)   !even(5) 
5 !!!!even(4)  even(4) 
4 !!!!!even(3)  !even(3) 
3 !!!!!!even(2)  even(2) 
2 !!!!!!!even(1)  !even(1) 
1 !!!!!!!!even(0) even(0) 
0 !!!!!!!!true  true 
+0

または 'even =(num)=>!(num%2);' – keja

+0

@kejaですが、元の関数はパラメータをゼロまでカウントダウンしてから反復を停止することです。 –

+0

ああ、出力だけを見ました。 – keja

2

の再帰呼び出しが簡素化できている起こります。

ステップ1

const f = n => { 
    const even = x => { 
     if (x == 0) 
      return true 
     else { 
      const odd = y => !even(y) 
      return odd(x - 1) 
     } 
    } 

    return even(n) 
} 

ステップ2

const f = n => { 
    const even = x => { 
     if (x == 0) return true 
     return !even(x - 1) 
    } 

    return even(n) 
} 

ステップ3

const f = n => { 
    let modificator = true 

    while (true) { 
     if (n == 0) return modificator 
     modificator = !modificator 
     n = n - 1 
    } 
} 

ステップ4

const f = n => !(n % 2) 
0

このコードは、再帰を使って偶数/奇数回の否定を行うことで動作します。 trueを無効にしても、trueとなります。 trueを否定する奇数時間はfalseとなります。 42チェック12を忘れてください。

コンソールを開くと、スタックトレースも表示されます。真 が返された理由を

return even(2) => 
even(2) => odd(2 - 1) 
odd(1) => return !even(1) 
!even(1) => ! (odd(1-1)) 
! (odd(0)) => ! (!(even(0))) => even(0) 
even(0) => true 

return even(1) => 
even(1) => odd(1 - 1) 
odd(0) => !even(0) 
!even(0) => !(true) => false 

xは厳密にその型と値に等しいと0で、私はよく分からない

これは再帰の最後尾に起こる

、このtrueは、での否定を使用して各再帰呼び出しが完了すると、truefalseの間で前後に切り替えられます

const res = ((n) => { 
 
    const even = (x) => { 
 
     if (x === 0) { 
 
      console.log(x); 
 
      console.trace(); 
 
      return true; 
 
     } 
 
     else { 
 
      const odd = (y) => !even(y); 
 
      console.log(x); 
 
      console.trace(); 
 
      return odd(x - 1); 
 
     } 
 
    } 
 
    return even(n) 
 
})(2) //=> true 
 

 
console.log(res);

関連する問題