编写递归函数求n的阶乘
由递归方式求的N的阶乘(即N,),时间复杂度是多少?
由递归方式求的N的阶乘(即N,),时间复杂度是多少?
递归求n的阶乘,会递归n次,每次递归内部计算时间是常数,故O(n)
阶乘的符号?
阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
亦即n!1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义:0!1,n!(n-1)!×n。
递归法求n的阶乘算法?
求n的阶乘的过程分为回推和递推。
1.回推
求n的阶乘可以描述如下:
n!n*(n-1)!
(n-1)!(n-1)*(n-2)!
(n-2)!(n-2)*(n-3)!
(n-3)!(n-3)*(n-4)!
...
2!2*1!
1!0!
0!1
1!1
如果把n!写成函数形式,即f(n),则f(5)就是表示5!。求5!的过程可以写成如下形式:
f(5)5*f(4)
f(4)4*f(3)
f(3)3*f(2)
f(2)2*f(1)
f(1)1
从上述过程可以看出,求f(5)就需要调用f(4),求f(4)就需要调用f(3),求f(3)就需要调用f(2),求f(2)就需要调用f(1)。其中f(5)、f(4)、f(3)、f(2)、f(1)都会调用同一个函数f,只是参数不同而已
C语言计算10的阶乘?
分析下程序,阶乘可以用递归做,也可以用循环做,这里就放上这两种代码了。
一.递归:
#include stdio.h
int f(int t)
{
if (t1)
return 1;
else
return t*f(t-1);
}
int main()
{
printf(d
,f(10));
return 0;
}
程序分析:定义一个f函数,利用递归的特性,进行运算
10*f(9) 10*9*f(8) …… 直到到1时返回1
得出结果:
二.循环:
#include stdio.h
int main()
{
int t11;
for(int i10;i1;i--)
{
t1 t1*i;
}
printf(d, t1);
return 0;
}
程序分析:直接用一个for循环进行自减即可完成,定义t1用于存储结果
得出结果: