递归偶数函数的理解问题(Javascript)
Recursive even function issue with understanding (Javascript)
问题很简单,我有一个来自'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
。同样的原理适用于所有整数。
- 我不知道我的编码有什么问题.(JavaScript)
- 登录后重定向,缓存页面问题-Javascript
- 在我的网站上创建一个在1-10之间不断变化的数字时遇到了问题.Javascript
- 浮点数字问题JavaScript
- 局部全局变量问题 - JavaScript
- 内容滑块问题 javascript
- 多个脚本导致链接问题?Javascript、CSS、HTML、Jquery
- 基本范围问题(javascript和node)
- 表单验证问题(Javascript)
- 表杂乱无章的问题.Javascript HTML5.
- 我的代码有什么问题.JavaScript幻灯片
- 这段代码有什么问题?(JavaScript)
- 浏览器和移动设备的视差背景问题(javascript/jquery)
- Mozilla中的setInterval()问题(Javascript函数)
- While循环问题-JavaScript-jQuery.Clone()
- 检查密码匹配问题(JavaScript)
- 抓取选中单选按钮的问题- JavaScript
- 基于下拉选择禁用文本字段的问题(JavaScript)
- 比较日期问题- javascript
- 浏览器兼容性问题Javascript