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);
}
我认为最好的解释是显示没有会发生什么返回中的code>。如果我们有:
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
递归调用中的code>将否定以前的值,因此新的调用堆栈如下所示:
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)))