Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有人能解释一下这个函数表达式是如何变为false的吗?_Javascript - Fatal编程技术网

Javascript 有人能解释一下这个函数表达式是如何变为false的吗?

Javascript 有人能解释一下这个函数表达式是如何变为false的吗?,javascript,Javascript,我理解if的第一部分,但第二部分不是说“因为'n'不等于零,所以在用逻辑not(!)运算符修改的偶数函数中返回'n'”? 如果我将5作为参数传递给fn(),它不返回4吗 不是用布尔Not修改偶数函数,而是在用n-1调用偶数函数的结果上应用Not。返回的不是4,而是!(偶数(4)) 如果我们将函数简化为 function even(n) { return n==0 || !even(n-1); } 我们收到您电话的以下扩展: even(5) 5==0 || !even(5-1) !even(4)

我理解
if
的第一部分,但第二部分不是说“因为'n'不等于零,所以在用逻辑not(!)运算符修改的偶数函数中返回'n'”? 如果我将5作为参数传递给
fn(),它不返回4吗


不是用布尔Not修改
偶数
函数,而是在用
n-1
调用
偶数
函数的结果上应用Not。返回的不是4,而是
!(偶数(4))

如果我们将函数简化为

function even(n) { return n==0 || !even(n-1); }
我们收到您电话的以下扩展:

even(5)
5==0 || !even(5-1)
!even(4)
!(4==0 || !even(4-1))
!!even(3)
!!(3==0 || !even(3-1))
!!!even(2)
!!!(2==0 || !even(2-1))
!!!!even(1)
!!!!(1==0 || !even(1-1))
!!!!!even(0)
!!!!!(0==0 || !even(0-1))
!!!!!(true || !even(0-1))
!!!!!true
!!!!false
!!!true
!!false
!true
false

这是递归计算正整数(见末尾注释)是否为偶数的一种低效但有效的方法。基本上,每次你检查一个非零的数字时,你都依赖于这样一个事实:n是否为偶数与n-1是否为非偶数相同。所以偶数(5)与!偶数(4),和!偶数(4)与!!偶数(3)(或偶数(3))。所以到最后,你算的是偶数(5)为!!!!!偶数(0)。我们知道,即使(0)返回真值,因此,因为!!否定它自己,我们就剩下了!对还是错

根据注释-由于这是一个递归函数,当它达到零时会结束,如果给它一个输入值,它将导致无限递归,这是检查一个数字是否为偶数的好方法。

偶数(n)
总是与
偶数(n-1)
相反

由于
偶数(0)
偶数(1)
,依此类推:2的所有倍数都为
,奇数为

查看它的一个简单方法可能是记录
[0,1,2,3,4,5].map(偶数)


如果你真的想知道一个正整数是否是偶数,那么你给出的解决方案是非常低效的,递归会导致任何大数的调用堆栈爆炸。这里有一个更合理的解决方案:

function even(n){
    return !(n%2);
}

我认为最好的解释是显示没有
会发生什么。如果我们有:

var fn = function even (n){
  if (n === 0)  return true;
  else return even(n - 1)
}
它总是会返回
true
,因为它最终会命中
0
。如果调用
fn(3)
,调用堆栈将如下所示:

fn(3)
  -> fn(2)
    -> fn(1)
      -> fn(0)
        true
      true
    true
  true
true
将否定以前的值,因此新的调用堆栈如下所示:

fn(3)
  -> fn(2)
    -> fn(1)
      -> fn(0)
        true
      !true
    !(!true)
  !(!(!true))
!(!(!(!true)))

!(!(!(!true))===true

您对术语“valid”的使用相当松散。当您询问
-2
1.5
时,函数会说什么?一个公平点-没有错误检查,因此只有在输入正确的情况下才能给出正确的结果。你是对的,我使用的是非正式意义上的“valid”,而不是严格的技术意义上的。这个函数忽略了负数可以是偶数的事实。
fn(3)
  -> fn(2)
    -> fn(1)
      -> fn(0)
        true
      !true
    !(!true)
  !(!(!true))
!(!(!(!true)))