理解递归甚至函数问题(Javascript)

时间:2015-08-19 15:01:47

标签: javascript recursion

问题很简单,我有一本来自“Javascript Allonge”的书,并且很难理解它。

该函数被称为偶数,它如下:

Long

检查数字是否均匀,但我不明白怎么做。它以递归方式调用自身,技术上总是达到零,不是吗?这有什么作用?

4 个答案:

答案 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。同样的原则适用于所有整数。