递归实现Ackerman函数.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
题目:已知Ackerman函数的定义如下: n+1 (m=0) Ackerman=Ackerman(m-1,1) m≠0 n=0Ackerman(m-1,Ackerman(m,n-1)) m≠0 n≠0(1)写出递归算法。(2)写出非递归算法(3)根据非递归算法画出求Akm(2,1)时的栈的变化过程。需求分析:递归设计时,可根据原函数写出算法,非递归设计时可以用数组栈实现,元素的压入和弹出非常方便。概要设计:非递归设计时,设两个数组栈 栈顶指针设为top.详细设计:(1)递归算法如下:int akm(int m,int n){//递归设计 int r,g; if(m==0) r=n+1; else if(n==0) r=akm(m-1,1); else { g=akm(m,n-1);r=akm(m-1,g);//两次连着递归 } return r; }main(){int a,b,c,i; while(1){ printf(input two numbers a and b (a4):); scanf(%d %d,a,b); if(a4b10||a3b2000||a2b4000||a1b32767)// 为了{ //防止执行非法操作 c=akm(a,b);//调用函数计算结果 printf(the result is:%d,c); } else printf(stack overflow!!!);//输入不合法 printf(\nare you continue?(1)yes (2)no:);//提示是否继续 scanf(%d,i); if(i!=1) break;}}(2)非递归算法如下:int akm1(int m, int n){int top,s1[MAX],s2[MAX];//定义两个数组栈top=0;s1[top]=m;s2[top]=n;//初始栈,并压入第一个元素do{ while(s1[top]){// s1栈顶元素非空将循环 while(s2[top]){ // s2栈顶元素非空将循环 top++;s1[top]=s1[top-1]; s2[top]=s2[top-1]-1; } s1[top]--;s2[top]=1; } if(top0){ top--;s1[top]--; s2[top]=s2[top+1]+1; } }while(top!=0||s1[top]!=0);//栈空或栈顶元素为空退出循环 r=s2[top]+1;//取出栈顶元素 top--; return r;//返回}main(){int a,b,c,i; while(1){ printf(input two numbers:); scanf(%d %d,a,b);if(a4b8||a3b1000||a2b4000||a1b32767){//为了 c=akm1(a,b); //防止执行非法操作 printf(the result is:%d,c);} else printf(stack overflow);//输入不合法 printf(\nare you continue?(1)yes (2)no:); scanf(%d,i); if(i!=1) break; }}调试分析: 在调试中发现A数值不能太大,否则将出非法操作,我想是循环次数太多,硬件栈溢出。因此设置条件。用户使用说明:在本程序运行时,有提示说明,操作非常简单,不再详述。测试结果:(1)input two numbers a and b (a4):2 3 the result is:9 are you contine?(1)yes (2)no:1 input two numbers a and b (a4):5 6stack overflow!!!are you contine?(1)yes (2)no:1input two numbers a and b (a4):2 654the result is:1311are you contine?(1)yes (2)no:2(2)input two numbers:2 5 the result is:13are you contine?(1)yes (2)no:1input two numbers:3 7the result is:1021are yo

文档评论(0)

mhk8089 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档