[英]Why does this function return true?
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,但是只有當x為0並嚴格等於其類型和值時它才會返回true,我不確定為什么返回true。 我認為任何值,但0應該返回false。 有人可以向我解釋一下,我對javascript和編程很新。
如果你用局部函數和IIFE去除所有不必要的部分,那么你只得到一個零的測試,那么它是一個偶數值或遞歸調用,甚至沒有減少一個值。
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
讓我們簡化。
第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
}
}
第四步
const f = n => !(n % 2)
該代碼通過使用遞歸進行偶數/奇數次的否定來工作。 即使是時代否定true
true
。 奇怪的時候否定true
會給出false
。 忘記42
檢查1
和2
。
如果打開控制台,也可以看到堆棧跟蹤。
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
這發生在遞歸的尾部,這是true
在true
和false
之間來回切換,因為每個遞歸調用使用否定來完成!even(y)
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.