这个 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,则 !!!truefalse.

看起来该函数通过简单地在每个连续调用上附加一个否定运算符 ! 来将多个递归调用链接在一起,然后使用它来根据最终结果确定数字是偶数还是奇数:

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 变为真。您可以重复执行此操作:!!truetrue!!!truefalse

基本上,这段代码可以简化为如下所示:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!true;

如果有偶数个 ! 否定,我们最终得到 true。如果有奇数,我们最终得到 false.

您引用的代码将 n ! 逻辑非运算符添加到 true,其中 n 是我们正在测试的值。奇数个 ! 的结果是 false;偶数导致 true.

这是聪明的代码:它不是用于生产的好代码! It's somewhere in the region of 1200 times slower than the simple % 2 test.