1、使用递归算法
#include <stdio.h>#include <process.h>
long factorial(int n)
{
long result
if (n<0)
{
printf("n<0,请输入大于等于0的整数!")
return -1
}
else if (n == 0 || n == 1)
{
result = 1
}
else
{
result = n*factorial(n - 1)
}
return result
}
main()
{
int n = 10.0
long iNum
iNum = factorial(n)
printf("10!=%ld\n", iNum)
system("pause")
}
2、使用循环
#include<stdio.h>#include<process.h>
int main()
{
int i = 1 //累加变量
long j = 1 //储存结果
int k = 1 //输入的数值
printf("请输入一个数字:")
scanf("%d", &k)
do
{
j = j*i
i++
} while (i <= k)
printf("%ld\n", j)
system("pause")
return 1
}
以上两种方式是求阶乘的普通算法,求得的结果表示范围都是有限的,如果算大数的阶乘还要另外的算法。
首先,这个叫做“阶乘”而不是“阶层”。其次,return
1是因为
0!
=
1,数学上就是这么定义的,这个和C语言无关。
递归有两个阶段,第一阶段是反复地调用自身,直到触发终止条件;第二阶段是,逐层计算并返回调用结果。
就拿你这个例子来说,假设要计算4的阶乘,首先是递归地调用自身:
4!
=
func(4),
此时n为4大于0,所以func(4)
=
4
*
func(4-1)
=
4*func(3)
同样地:
3!
=
func(3)
=
3*func(3-1)
=
3*func(2)
2!
=
func(2)
=
2*func(2-1)
=
2*func(1)
1!
=
func(1)
=
1*func(1-1)
=
1*func(0)
这时注意了,当计算func(0)时,n=0,触发边界条件,所以递归调用停止,return
1。
接下来,就是以相反的顺序,,逐层返回结果了:
0!
=
func(0)
=
1
1!
=
func(1)
=
1*func(0)
=
1*1
=
1
2!
=
func(2)
=
2*func(1)
=
2*1
=
2
3!
=
func(3)
=
3*func(2)
=
3*2
=
6
4!
=
func(4)
=
4*func(3)
=
4*6
=
24
这样就得到了最终的结果:24。