在阅读Javascript Allonge时,我一直试图弄清楚为什么会这样;
((n) => {
const even = (x) => {
if (x === 0)
return true;
else
return !even(x - 1);
}
return even(n)
})(97)
返回true为false,具体取决于提供的数字是奇数还是偶数。
当我看到它时,我认为它正在检查提供的数字是否为0,如果没有减去1,则再次检查。这意味着该数字最终达到0并返回true。这显然不是发生了什么,因为97它返回false而96真。
我唯一不知道的就是return !even(x -1);
之前的爆炸声。
答案 0 :(得分:4)
哦,这太糟糕了,太棒了。编写代码以检查奇数和偶数的方法是什么方法!
首先要注意的是,这是一个递归函数:它反复调用自身。每次都会减少相关数字,因此它最终会一直下降到0
。
"聪明"这段代码所做的是!
,它反转了函数调用的布尔结果。 true
变为false
,false
变为真。您可以重复执行此操作:!!true
为true
,!!!true
为false
。
基本上,此代码可以简化为以下内容:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!true;
如果存在偶数!
次否定,我们最终会得到true
。如果有奇数,我们最终会得到false
。
您引用的代码将 n !
逻辑NOT运算符添加到true
,其中 n 是我们正在测试的值。奇数!
s导致false
;偶数会产生true
。
这是一个聪明的代码:它不是在生产中使用的好代码! It's somewhere in the region of 1200 times slower than the simple % 2
test.
答案 1 :(得分:1)
它基本上将N !
个操作串联在一起,其中N是输入数字。例如,如果N为3,则!!!true
为false
。
答案 2 :(得分:1)
看起来该函数通过在每个连续调用上附加一个否定运算符!
然后根据最终结果确定该数字是偶数还是奇数来将多个递归调用链接在一起:
even(2) => !!(true) => (true)(true) => true
even(3) => !!!(true) => (true)(!true) => (true)(false) => false
even(4) => !!!!(true) => (true)(true)(true) => true
正如您所看到的,它将继续在从零开始的偶数和奇数调用之间交替,从而让您知道结果是偶数还是奇数。
这绝对不是解决这个问题的最佳方式。
答案 3 :(得分:0)
感叹号是JavaScript中的否定;该算法在该行上所做的是说,无论你给出什么值x,它都与x-1相反