递推与递归练习题.doc_第1页
递推与递归练习题.doc_第2页
递推与递归练习题.doc_第3页
递推与递归练习题.doc_第4页
递推与递归练习题.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

练习1. (用递归做)5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。2. (用递归做)商人渡河问题是这样的:有三个商人,三个强盗,和一条船(船每次只可以载小于等于两个人)他们同在河的一边,想渡过河去,但是必须保证在河的任何一边必须保证商人的数目大于等于强盗的数目,应该怎么过这条河呢?注意:开始时商人,强盗所在的河的这边设为0状态,另一边设为1状态(也就是船开始时的一边设为0,当船驶到对岸是设为1状态,在这两个状态时,都必须符合条件)3. (用递推做)猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第30天早上想再吃时,见只剩下1个桃子了。求第一天共摘了多少。4. (用递推做)已知一对兔子每一个月能生一对小兔子,而一对小兔子出生后第二个月就开始生小兔子,假如一年内没有发生死亡,则以对兔子一年能繁殖成多少对?答案:1. #include int age(int n) if(n=1) return(10); else return age(n-1)+2; void main() int n; n=5; printf(The fifth age is %d.n,age(n); 2. #include#include #include struct node /*建立一个类似栈的数据结构并且可以浏览每一个数据点*/ int x; int y; int state; struct node *next; ; typedef struct node state; typedef state *link; link PPointer1=NULL; link PPointer2=NULL; int a1,b1; int a2,b2; /*栈中每个数据都分为0,1状态*/ void Push(int a,int b,int n) link newnode; newnode=(link)malloc(sizeof(state); newnode- x=a; newnode- y=b; newnode- state=n; newnode- next=NULL; if(PPointer1=NULL) PPointer1=newnode; PPointer2=newnode; else PPointer2- next=newnode; PPointer2=newnode; void Pop() /*弹栈*/ link pointer; if(PPointer1=PPointer2) free(PPointer1); PPointer1=NULL; PPointer2=NULL; pointer=PPointer1; while(pointer- next!=PPointer2) pointer=pointer- next; free(PPointer2); PPointer2=pointer; PPointer2- next=NULL; int history(int a,int b,int n) /*比较输入的数据和栈中是否有重复的*/ link pointer; if(PPointer1=NULL) return 1; else pointer=PPointer1; while(pointer!=NULL) if(pointer- x=a&pointer- y=b&pointer- state=n) return 0; pointer=pointer- next; return 1; int judge(int a,int b,int c,int d,int n) /*判断这个状态是否可行,其中使用了history函*/ if(history(a,b,n)=0) return 0; if(a=0&b=0&a=3&b=0&d=0&c=3&d=b) Push(a,b,n); return 1; else return 0; else return 0; int Duhe(int a,int b,int n) /*递归法解决商人渡河问题,如果这一个状态符合*/ /*则判断下一个状态,直至问题解决*/ if(a=0&b=0) return 1; if(n=0) /*判断0状态时,商匪状态是否符合要求*/ if(judge(a-1,b-1,4-a,4-b,1) if(Duhe(a-1,b-1,1)=1) return 1; if(judge(a,b-2,3-a,5-b,1) if(Duhe(a,b-2,1)=1) return 1; if(judge(a-2,b,5-a,3-b,1) if(Duhe(a-2,b,1)=1) return 1; if(judge(a-1,b,4-a,3-b,1) if(Duhe(a-1,b,1)=1) return 1; if(judge(a,b-1,3-a,4-b,1) if(Duhe(a,b-1,1)=1) return 1; else Pop(); return 0; if(n=1) /*判断0状态时,商匪状态是否符合要求*/ if(judge(a+1,b+1,2-a,2-b,0) if(Duhe(a+1,b+1,0)=1) return 1; if(judge(a,b+2,3-a,1-b,0) if(Duhe(a,b+2,0)=1) return 1; if(judge(a+2,b,1-a,3-b,0) if(Duhe(a+2,b,0)=1) return 1; if(judge(a+1,b,2-a,3-b,0) if(Duhe(a+1,b,0)=1) return 1; if(judge(a,b+1,3-a,2-b,0) if(Duhe(a,b+1,0)=1) return 1; else Pop(); return 0; return 0; main() link pointer; Push(3,3,0); Duhe(3,3,0); pointer=PPointer1; while(pointer!=NULL) printf( %d,%d-%dn ,pointer- x,pointer- y,pointer- state); pointer=pointer- next; getch(); 3. #include #include #define N 30void main()int n, si,si1;si1=1;for(n=N-1;n=1;n-)/倒数第二天开始si=(si1+1)*2; /算出当天的桃子数si1=si;printf(共有%d天,第一天的桃子数为 %4dn,N,si);4. 程序源代码: main() long f1,f2; int i; f1=f2=1; for(i=1;i=20;i+) printf(%12ld %12ld,f1,f2); if(i%2=0) printf(n);/*控制输出,每行四个*/ f1=f1+f2;/*前两个月加起来赋值给第三个月*/ f2=f1+f2;/*前两个月加

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论