阶乘. .我不知道为什么这个代码可以工作
factorials... I have no idea why this code works
我在freecodecamp上遇到了一个练习,需要编写一个代码来返回给定整数的阶乘,并给出了这个例子:例如:5!= 1 * 2 * 3 * 4 * 5 = 120f。
我知道数学是如何工作的,但我无法真正理解如何编写它,直到我在这里发现了一些东西,n stackoverflow,但没有解释它为什么工作,类似于:
function factorialize(num) {
if(num === 0) {
return 1;
} else {
return num * factorialize(num - 1);
}
}
factorialize(5);
我真的不明白这是如何遍历所有小于或等于num的整数的,有人能帮我解释一下吗?
这是一个递归函数。
使用5调用factoralize会执行以下操作:
5等于0吗?不,那么:
return num * factorialize(num - 1);
将num替换为5意味着实际上返回的是:
5 * factorialize(5-1)
我们可以化简成
5 * (factorialize(4))
然后必须在语句的后半部分调用factoralize来计算返回值。
你可以想象,当num = 4时,因子分解再次被调用。由于num不等于零,它也返回相同的num * factorialize(num-1)
。原来的语句现在是:
5 * (4 * factorialize(3))
,所以它必须再次调用自己…一次又一次……直到我们有
5 * 4 * 3 * 2 * 1 * factorialize(0)
返回一个数字——这被称为基本情况,所以它不会对自己无限递归。它返回1。
导致
5 * 4 * 3 * 2 * 1 * 1
我认为基本情况应该是if (num == 1)。无论哪种方式都可以
基于注释编辑:0是有意义的,显然它现在涵盖了0的阶乘。谢谢!对于基本情况num == 1,它只适用于参数num> 0的因式分解。
这叫做递归。基本思想是一个函数调用自己,但传递一个越来越接近基can的值,从而结束进程。查看这里:https://en.wikipedia.org/wiki/Recursion_(computer_science)和这里:理解递归了解更多信息。
用的是递归。简单地说,递归就是函数调用自身时发生的事情。在这个例子中,每次传递给因子分解时,num都会减少,并且num会乘以传递给因子分解的数字。尝试在else块中添加print语句,以查看每次调用
这是递归函数的基本实现。
https://en.wikipedia.org/wiki/Recursion_ (computer_science)
递归的工作原理基本上是让函数调用自己。因此,我们将num * (num-1)一直乘到0(返回1)。
- 代码只能在jsfiddle中工作
- 为什么不是'我的函数在解析云代码中工作吗?当我在Angular和Express中测试时,它是有效的
- 谷歌地图Api和JS代码不工作
- 如何检查这个代码点火器php函数是否工作,该函数是否在ajax url中使用
- 为什么这个代码不能正常工作
- Don't工作警报代码jQuery
- addEventListener的Javascript代码不工作!?(单击时打开放大的img)
- 我需要一个jQuery函数来只工作在700px以上的屏幕大小,无法在我的代码中发现错误
- 这个jquery代码是如何工作的
- 代码在angular中未按预期工作
- JavaScript代码未按预期工作
- 为什么jQuery代码段在没有IFrame的情况下可以工作,而在有IFrame时却不能工作
- 谷歌地图自动完成,即使使用工作代码也无法工作
- 需要 RepeatBox 及其行单击事件的工作代码才能在 smartface.io 中跳转到相应的页面上
- 任何人都可以指出我的工作代码或完整的概念图,用于 Angular2 中的 ViewMetadata
- 为什么我可以'不要对这个工作代码进行jsFiddle处理
- 工作代码带来错误addEventListener不是一个函数
- 需要修改此工作代码以在新窗口/选项卡中打开
- jQuery:如何计算和显示列的总和(部分工作代码)
- D3js缩放/拖动在我的代码中不再工作(+代码示例)