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