问题很简单,我有一本来自“Javascript Allonge”的书,并且很难理解它。
该函数被称为偶数,它如下:
Long
检查数字是否均匀,但我不明白怎么做。它以递归方式调用自身,技术上总是达到零,不是吗?这有什么作用?
答案 0 :(得分:7)
这是基于数字奇数或偶数的归纳定义 - 数字,n
是偶数'当它之前的数字,n - 1
是奇数。这种想法自然是有道理的 - 即使3是奇数,4也是如此。
所以函数even
定义为:
<强> 1。 even(0)
为真 - 因为0甚至
<强> 2。 even(n)
是对even(n - 1)
另一种思考方式是想象even(4)
被逐步调用。手动,用你的函数替换even(4)和评估结果:
even(4)
= !(even(3))
= !(!even(2))
= !(!(!even(1))
= !(!(!(!even(0)))
= !(!(!(!true))
= true
// ...even(4) == true
答案 1 :(得分:1)
好吧,分而治之。
首先,你有两个要计算的表达式。第一个是在数字为0时停止递归,这很容易。
第二个表达
!(even(num -1))
有点复杂。它始终以调用even(num -1)
开头,然后否定它。
对于第一个元素!(even(num -1) === true)
,现在您看到对于从1(1,3,5等)开始的每个第二个元素,它将返回false
,而其他元素则返回反转值。< / p>
答案 2 :(得分:0)
但是对even
的递归调用存在否定,因此,对于堆栈上的每个激活记录,返回值都会被反转:
0 --> true
1 --> true --> false
2 --> true --> false --> true
答案 3 :(得分:0)
此函数确实以递归方式调用自身,但每次都添加了反转。当return (num === 0)
等于零时,true
会返回num
。如果num
大于零,则会计算even(num-1)
的结果并将其反转。
因此,对于num = 1
,函数返回even(0)
的倒数,即true
,得到最终结果false
。使用num = 2
时,函数会返回even(1)
的倒数,我们刚刚显示为false
,结果为true
。同样的原则适用于所有整数。