Ackerman的递归与非递归算法
2015-11-06 16:46
495 查看
已知Ackerman函数的定义如下:
akm(m,n)=⎧⎩⎨n+1,akm(m−1,1),akm(m−1,akm(m,n−1)),m = 0m≠0,n=0m≠0,n≠0
请设计对应的递归算法和非递归算法。
1)递归算法:
2)非递归算法
完整代码如下:
效果如下:
图(1) Ackerman递归算法
图(2) Ackerman非递归算法
akm(m,n)=⎧⎩⎨n+1,akm(m−1,1),akm(m−1,akm(m,n−1)),m = 0m≠0,n=0m≠0,n≠0
请设计对应的递归算法和非递归算法。
1)递归算法:
//Ackerman递归算法 int akm1(int m,int n){ int q; if(m==0) return n+1; else if(n==0) return akm1(m-1,1); else{ q=akm1(m,n-1); return akm1(m-1,q); } }
2)非递归算法
//Ackerman非递归算法 int akm2(int m,int n){ struct{ int vm,vn; //分别保存m和n值 int vf; //保存akm(m,n)值 int tag; //标识是否求出akm(m,n)值,1:表示未求出,0:表示已求出 }St[MaxSize]; int top=-1; //栈指针 top++; //初值进栈 St[top].vm=m; St[top].vn=n; St[top].tag=1; while(top > -1){ //栈不空时循环 if (St[top].tag==1) //未计算出栈顶元素的vf值 { if (St[top].vm==0) //(1)式 { St[top].vf=St[top].vn+1; St[top].tag=0; } else if (St[top].vn==0) //(2)式 { top++; St[top].vm=St[top-1].vm-1; St[top].vn=1; St[top].tag=1; } else //(3)式 { top++; St[top].vm=St[top-1].vm; St[top].vn=St[top-1].vn-1; St[top].tag=1; } } else if (St[top].tag==0) //已计算出vf值 { if (top>0 && St[top-1].vn==0) //(2)式 { St[top-1].vf=St[top].vf; St[top-1].tag=0; top--; } else if (top > 0) //(3)式 { St[top-1].vm=St[top-1].vm-1; St[top-1].vn=St[top].vf; St[top-1].tag=1; top--; } } if(top==0 && St[top].tag==0) //栈中只有一个已求出vf的元素时退出循环 break; } return St[top].vf; }
完整代码如下:
#include <stdio.h>
#define MaxSize 100
//Ackerman递归算法 int akm1(int m,int n){ int q; if(m==0) return n+1; else if(n==0) return akm1(m-1,1); else{ q=akm1(m,n-1); return akm1(m-1,q); } }
//Ackerman非递归算法 int akm2(int m,int n){ struct{ int vm,vn; //分别保存m和n值 int vf; //保存akm(m,n)值 int tag; //标识是否求出akm(m,n)值,1:表示未求出,0:表示已求出 }St[MaxSize]; int top=-1; //栈指针 top++; //初值进栈 St[top].vm=m; St[top].vn=n; St[top].tag=1; while(top > -1){ //栈不空时循环 if (St[top].tag==1) //未计算出栈顶元素的vf值 { if (St[top].vm==0) //(1)式 { St[top].vf=St[top].vn+1; St[top].tag=0; } else if (St[top].vn==0) //(2)式 { top++; St[top].vm=St[top-1].vm-1; St[top].vn=1; St[top].tag=1; } else //(3)式 { top++; St[top].vm=St[top-1].vm; St[top].vn=St[top-1].vn-1; St[top].tag=1; } } else if (St[top].tag==0) //已计算出vf值 { if (top>0 && St[top-1].vn==0) //(2)式 { St[top-1].vf=St[top].vf; St[top-1].tag=0; top--; } else if (top > 0) //(3)式 { St[top-1].vm=St[top-1].vm-1; St[top-1].vn=St[top].vf; St[top-1].tag=1; top--; } } if(top==0 && St[top].tag==0) //栈中只有一个已求出vf的元素时退出循环 break; } return St[top].vf; }
void main()
{
int num1=0,num2=0,num3=0;
// num1=akm1(0,1);
// num2=akm1(1,2);
// num3=akm1(3,3);
num1=akm2(0,1);
num2=akm2(1,2);
num3=akm2(3,3);
printf("akm2(0,1)= %d\n",num1);
printf("akm2(1,2)= %d\n",num2);
printf("akm2(3,3)= %d\n",num3);
}
效果如下:
图(1) Ackerman递归算法
图(2) Ackerman非递归算法
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性
- C++ Custom Control控件向父窗体发送对应的消息