这是一本书中的一个例子。如果是偶数则返回TRUE,如果不是则返回FALSE。我不明白这是怎么回事。这是我的理解:
- 42结合n
- 创建"even"函数
- x与n结合= 42
- x != 0
- 启动"else"
- 创建"奇数"函数
- odd(42 - 1)
- 启动"!(41)"。
JS如何处理"even(41)"?TRUE从何而来?我理解它的方式应该返回TRUE只有当x === 0
document.write(
((n) => {
const even = (x) => {
if (x === 0) return true;
else {
const odd = (y) => !even(y);
return odd(x - 1);
}
}
return even(n)
})(42)
)
故意让人困惑。遵循逻辑。
如果n不为0,则创建一个名为odd的新函数,该函数调用偶数并反转偶数的布尔值。
然后我们用n-1调用函数。所以本质上,它就像一个while循环,你不断地从数字中减去1,并在每一步中反转它的真假,直到你得到0。如果函数被调用偶数次,它就是偶数。如果它被称为奇数次,它就是奇数。
下面的代码执行与图书示例相同的逻辑,包括递归的使用,但如果使用非整型或负值调用isEven
,则会防止无限循环。
const isEven = (n) =>
{
const even = (x) => x ? !even(x-1) : true;
return even( Math.abs(Math.floor(n)));
}
isEven( 42)
现在台架逻辑测试相当直接:
even( 0) returns true;
even( 1) returns !even( 1-1), which is !even(0), which is false;
even( 2) returns !even( 2-1), which is !even(1), which is true;
对于更大的数,使用等等。参数值的每一次递增都执行一次对偶数的额外递归调用,以补充它下面的数字的"偶数",直到达到硬编码为偶数的零。
最终结果是,如果even
被调用奇数次(对于偶数),isEven
返回true
;如果even
被调用偶数次(对于奇数),isEven
返回false。