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和编程都很陌生。
答案 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
检查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)
处的否定完成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);