2015-07-19 295 views
0

我遇到了freecodecamp的一个练习,它需要编写一个代码来返回给定整数的阶乘,并给出了这个例子: 例如:5! = 1 * 2 * 3 * 4 * 5 = 120f。阶乘...我不知道为什么这段代码工作

我得到怎样的数学作品,但我真的不能换我围​​绕如何编写它的头,直到我发现这里的东西,正计算器,但没有为什么它的explination,活象是:

function factorialize(num) { 
    if(num === 0) { 
    return 1; 
    } else { 
    return num * factorialize(num - 1); 
    } 
} 

factorialize(5); 

我真的不明白这是如何迭代所有小于或等于num的整数。有人可以帮我解释一下吗?

回答

2

这是一个递归函数。

调用factorialize 5执行以下操作:

为5等于0?不,这样的话:

return num * factorialize(num - 1); 

代5 num表示它真的返回:

5 * factorialize(5-1) 

因此,我们可以简化到

5 * (factorialize(4)) 

然后必须调用factorialize第二一半的声明给计算机返回值。

所以你可以想象,factorialize与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 

所得我认为基本情况应该是,如果(NUM == 1)。无论哪种方式它工作

编辑根据评论:0是有道理的,它显然现在覆盖0阶乘。谢谢!对于num == 1的基本情况,它只会对参数num> 0进行因式分解。

+0

因为0,所以'num == 0'! (零阶乘)等于1。 – MrMadsen

0

它使用了一种叫做递归的东西。简而言之,递归是函数自我调用时发生的事情。所以在这个例子中,num在每次传递给factorialize时递减,并且num乘以传递给factorialize的数字。尝试在else块添加打印语句来看看这个数字被减少每次调用

相关问题