#include
成都创新互联专注于三元网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供三元营销型网站建设,三元网站制作、三元网页设计、三元网站官网定制、成都微信小程序服务,打造三元网络公司原创品牌,更为您提供三元网站排名全网营销落地服务。
#include
/*求n的
阶乘
,递归,
分母
部分
*
结束条件为:1的阶乘=1
*
递归时,一定要有结束条件
*/
int
factorial
(n)
{
if(n==1)
//递归结束条件,1的阶乘为1
return
1;
else
return
n*factorial(n-1);
//n的阶乘为n乘以(n-1)!
}
int
main()
{
int
n,x;
size_t
i;
//i为
无符号整数
double
re=0;
printf("input
n
and
x:");
scanf("%d%d",n,x);
//输入n和x的值
for(i=1;i=2*n-1;i+=2)
{
/*pow函数求的是x的i次方,分母为
i的
阶乘。本部分可以优化,因为i的阶乘算出来了,所以i+2的阶乘就是i的阶乘*(i+1)*(i+2),不用重复来计算阶乘。自己可以试试*/
re
+=
pow(x,i)/factorial(i);
}
printf("\nn=%d\tx=%d\tresult=%f\n",n,x,re);//打印出
最后的结果
return
0;
}
首先明确题目要求:递归函数,求n!
递归函数的含义:
编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。
n!表示阶乘函数,即1*2*3*……*n
下面给出代码:(C语言实现 )
比较简单的尾递归实现:
#includestdio.h
long digui(int n); //递归函数声明
int main()
{
int n;
scanf("%d",n);
printf("the result is %ld",digui(n)); //打印出递归值
return 0;
}
long digui(int n) //递归函数部分
{
if(n1)
return n*digui(n-1); //调用递归,让n与n-1相乘,直到n1时
return 1; //n1时,返回1,实现 n*(n-1)*(n-2)*……*3*2*1
}
#includestdio.h
void revert(int cnt) {
int tmp;
if(cnt0)
{
scanf("%d",tmp);
revert(cnt-1);
printf("%d ",tmp);
}
}
void main(void)
{
int cnt=0;
scanf("%d",cnt);
revert(cnt);
}
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
函数嵌套调用过程示例
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
例如,下列为某人祖先的递归定义:
某人的双亲是他的祖先(基本情况)。某人祖先的双亲同样是某人的祖先(递归步骤)。斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21..... I[1]
斐波纳契数列是典型的递归案例:
递归关系就是实体自己和自己建立关系。
Fib(0) = 1 [基本情况] Fib(1) = 1 [基本情况] 对所有n 1的整数:Fib(n) = (Fib(n-1) + Fib(n-2)) [递归定义] 尽管有许多数学函数均可以递归表示,但在实际应用中,递归定义的高开销往往会让人望而却步。例如:
阶乘(1) = 1 [基本情况] 对所有n 1的整数:阶乘(n) = (n * 阶乘(n-1)) [递归定义] 一种便于理解的心理模型,是认为递归定义对对象的定义是按照“先前定义的”同类对象来定义的。例如:你怎样才能移动100个箱子?答案:你首先移动一个箱子,并记下它移动到的位置,然后再去解决较小的问题:你怎样才能移动99个箱子?最终,你的问题将变为怎样移动一个箱子,而这时你已经知道该怎么做的。
如此的定义在数学中十分常见。例如,集合论对自然数的正式定义是:1是一个自然数,每个自然数都有一个后继,这一个后继也是自然数。
德罗斯特效应是递归的一种视觉形式。图中女性手持的物体中有一幅她本人手持同一物体的小图片,进而小图片中还有更小的一幅她手持同一物体的图片,依此类推。
德罗斯特效应
又例如,我们在两面相对的镜子之间放一根正在燃烧的蜡烛,我们会从其中一面镜子里看到一根蜡烛,蜡烛后面又有一面镜子,镜子里面又有一根蜡烛……这也是递归的表现。
1、编写递归函数求 1+2+3+……+n 的和;
2、编写递归函数求 2*4*6*……*(2n) 的积;
3、编写递归函数求 n 的阶乘;
4、汉诺塔问题;
实际上很多问题都可以通过递归来实现,但是看到你的情况估计较难的你实现不了,所以给你几个简单的练习一下,这样可以增强对递归的理解,等理解的较为深入后再做稍微难一些的。
#includestdio.h
#includestring.h
int isLetter(char c){
if(c= 'A' c= 'Z') return 1;
if(c= 'a' c= 'z') return 1;
return 0;
}
int ID(char *s ,int m,int n){
int i;
int cnt = 0;
for(i=m;i=n;i++){
if(s[i] == '(') cnt ++;
if(s[i] == ',') {
if(cnt == 1) return i;
}
if(s[i] == ')') cnt --;
}
return i;
}
int isS(char *s,int m,int n){
if(m == n isLetter(s[m])) return 1;
int k = ID(s,m,n);
if( s[m] == '('
s[n] == ')'
k m
k n
isS(s,m+1,k-1)
isS(s,k+1,n-1)
) return 1;
else return 0;
}
int main(){
char s[4096];
while(gets(s)){
if(isS(s,0,strlen(s)-1)) printf("%s是S表达式\n",s);
else printf( "%s不是S表达式\n",s);
}
}