簡體   English   中英

為什么這個函數返回true?

[英]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檢查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

這發生在遞歸的尾部,這是truetruefalse之間來回切換,因為每個遞歸調用使用否定來完成!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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM