递归偶数函数的理解问题(Javascript)

Recursive even function issue with understanding (Javascript)

本文关键字:问题 Javascript 函数 递归      更新时间:2023-09-26

问题很简单,我有一个来自'Javascript Allonge'书的函数,并且很难理解它。

函数被偶调用,如下所示:

var even = function(num) {
    return (num === 0) || !(even(num -1));
}

它检查数字是否偶数,但我不明白如何。它递归地调用自己,从技术上讲,总是达到0,不是吗?这是怎么做到的呢?

这是基于奇数或偶数的归纳定义-一个数字,n是'偶数',当它前面的数字n - 1是奇数时。这种想法自然是有道理的——4是偶数,而3是奇数。

则函数even定义为:

1。even(0)为真-因为0是偶数

2。even(n)even(n - 1)

的负值

另一种思考方式是想象even(4)被一步一步地调用。手动将偶数(4)替换为用函数求值的结果:

even(4)
= !(even(3))
= !(!even(2))
= !(!(!even(1))
= !(!(!(!even(0)))
= !(!(!(!true))
= true

// ...even(4) == true

好吧,分而治之。

首先你有两个表达式要计算。第一种方法是在数字为0时停止递归,这很简单。

第二个表达式

!(even(num -1))

稍微复杂一些。它总是以调用even(num -1)开始,然后否定它。

对于第一个元素!(even(num -1) === true),现在您可以看到,对于从1(1,3,5等)开始的每个第二个元素,它将返回false,对于其他元素,它将返回颠倒的值。

但是对even的递归调用有一个否定,因此,对于堆栈上的每个激活记录,返回值被反转:

0 --> true
1 --> true --> false
2 --> true --> false --> true

这个函数确实递归地调用自己,但是每次都增加了反转。当num等于零时,return (num === 0)返回true。如果num大于0,则计算even(num-1)的结果并取反。

因此,对于num = 1,该函数返回even(0)的逆,即true,使最终结果为false。对于num = 2,该函数返回even(1)的倒数,即我们刚刚展示的false,从而得到最终结果true。同样的原理适用于所有整数。