为什么这个函数返回true?

时间:2017-08-20 09:21:46

标签: javascript function recursion lambda functional-programming

              A      A1      B      B1
2013-01-01  (1,1)  (2,1)  (1,2)  (2,2)            
2013-01-03  (3,1)  (4,1)  (3,2)  (4,2)  
2013-01-05  (5,1)  (6,1)  (5,2)  (6,2)

因为在参数中使用了42,但是只有当x为0且严格等于其类型和值时它才会返回true,我不确定为什么返回true。我认为任何值,但0应该返回false。有人可以向我解释一下,我对javascript和编程都很陌生。

3 个答案:

答案 0 :(得分:6)

如果你用局部函数和IIFE去除所有不必要的部分,那么你只得到一个零的测试,然后它是一个偶数值或递归调用,即使没有减少一个值。

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

的递归调用
cacheName

答案 1 :(得分: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)

答案 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

这发生在递归的尾部,truetruefalse之间来回切换,因为每个递归调用都使用!even(y)处的否定完成p>



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);