阶乘

来源:互联网 发布:免费一级域名注册永久 编辑:程序博客网 时间:2024/04/28 10:05

一个正整数乘上比他小的所有正整数即得到阶乘。(这句是对阶乘运算本质的理解)例如,4的阶乘(数学表示为4!)是4X3X2X1,即24.而5!是5x4X3X2X1,即120.有人会注意到一个公式:

当x>1,x!=x X (x-1)!

当x=1,x!=1;

换句话说,1的阶乘明确的定义为1;其他所有的阶乘可以根据阶乘的定义,导致阶乘函数的递归实现:

函数用比n小1的数来调用它自己,知道n等于1为止。当n等于1时,递归展开,提供正确答案。

递归实现非常简单,但并不快。假定处理大范围正整数时,一个非常大的正整数的阶乘可能导致栈的溢出。函数调用的效率并不高。解决的办法是不要递归,用迭代函数来实现factorial:

factorial的迭代实现要长一些,看上去比递归实现更复杂。但因为去掉了函数调用和栈操作的开销,所以比递归方法执行起来更快。

 

factorial的函数可以通过查表来实现,它去掉了反复的乘法运算,但需要为表分配静态存储空间。

 

总结:迭代的运行速度要优于递归的运行速度;而查表的运行速度优于迭代的运行速速。查表法的缺陷是需要大的空间来存储表的结构。

 

这里对阶乘本质的理解:一个正整数乘上比他小的所有正整数就是得到阶乘。我喜欢这句话,它与我们在学校里的课本上的说法是不同的,我觉得这种说法更合理,更接近阶乘运算的本质。