Ackerman函数 非递归 java_Ackerman(nm)函数的非递归算法.doc
Ackerman(nm)函数的非递归算法
题目:已知Ackerman函数的定义如下:
A(1,0)=2n=1,m=0
Ackerman= A(0,m)=1 n=0,m>=0
A(n,0)=n+2m=0,n>=2
A(A(n-1,m),m-1)m,n>=1
设计思想:
m,n成对出现,将其作为一个组合,通过栈保存。
然后分4部分处理(如题所示);
通过笔算研究规律:
I、当计算“m,n>=1”时,总是先n--(“m--”是到出口返回才计算的),直到算到“n=0,m>=0”的第一个出口;
II、此时进入第二段函数,开始返回计算,相当于A(n-1,m)置1,m--;
III、当m减到0时,如果n=1,进入第一段函数;
如果n>=2,进入第三段;
4 2 2
,
2 2 2
4
4
非递归算法:
#include
using namespace std;
class elem//栈中元素类型的定义
{
public:
int n;
int m;
public:
elem(){}
elem(int x,int y)
{n=x;m=y;}
void output()
{cout<
};
class stack//栈的定义
{
private:
elem *e;
int msize;
int top;
public:
stack(int);
bool isempty();
bool isoverflow();
void push(elem);
int GetTop();
void pop();
elem GetElem(int);
void output();
};
stack::stack(int n)//构造函数
{
msize=n;
e=new elem[msize];
top=-1;
}
bool stack::isempty()//判断栈是否为空
{
if(top==-1)
{
cout<
return 1;
}
else
return 0;
}
bool stack::isoverflow()//判断栈是否溢出
{
if(top==msize-1)
{
cout<
return 1;
}
else
return 0;
}
void stack::push(elem x)//数据入栈
{
if(!isoverflow())
e[++top]=x;
}
int stack::GetTop()//获得top的值
{
return top;
}
void stack::pop()//数据出栈,不弹出元素。
{
top--;
}
elem stack::GetElem(int top)//获得当前top值指向的数据元素
{
return e[top];
}
void stack::output()//输出栈中的数据
{
for(int i=0;i<=top;i++)
e[i].output();
cout<
}
int A(int n,int m)//Ackerman函数
{
elem u;
u.n=n;u.m=m;
stack s(20);
int t;
s.push(u);
while(s.GetTop()!=-1)
{
if(n<0 || m<0 ||(n>=3 && m>3) ||(n>=4 && m>=3))
//注意两个越界的条件(3,4)和(4,3)
{
cout<
exit(1);
}
if(u.n==1 && u.m==0)//用if/while皆可;
{
s.pop();
if(s.GetTop()==-1)//对"n=1,m=0"的情况特殊处理
return 2;
u=s
Ackerman函数 非递归 java_Ackerman(nm)函数的非递归算法.doc相关推荐
- Ackerman函数 非递归 java_Ackerman函数的非递归实现.
在网上看到了一些人在找这个Ackerman函数 , 不知道这个函数的实际含义,首先看到了他的递归形式: 注释部分是分析后的结果. int rackerman(int m,int n) { if(m== ...
- 递归和非递归实现规律函数
1.问题 A(n) = n / (2 * n + 1) B1 = 2 + A1; B2 = 2 + A1 * (2 + A2); B3 = 2 + A1 * (2 + A2 * (2 + A3)); ...
- python非递归前序遍历二叉树_Python非递归实现二叉树的后续遍历
leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...
- mysql 实现非递归树_二叉树的非递归前序,中序,后序遍历算法
#include #include struct tree { char data; struct tree *lchild; struct tree *rchild; }; typedef stru ...
- 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树
import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...
- java 非递归求二叉树高度_非递归算法实现二叉树高度
思路: 嘻嘻,请读者自己手动模拟.博主这里不知道怎么说. 拓展: 该算法思路也适用于 (1)每层的结点个数 (2)树的最大宽度 (3)节点位于某一层 int height(BiTree T){ if( ...
- 3. ackerman函数的递归实现算法用java语言_ackerman函数递归算法
5-2 已知 Ackerman 函 5-1 已知 A[n]为整数数组,试写出实现下列运算的递归算法: (1) 求数组 A 中的最大整数. (2) 求 n 个整数的和. (3) 求 n...... 2 ...
- C++第七次作业(函数_递归与非递归_多文件)
文章目录: 一:C++递归与非递归实现整数的阶乘 代码实现 运行结果 二:C++递归与非递归实现Fibonacci数列的计算:a0=1; a1=1; a2=a0+a1; a3=a1+a2; ..... ...
- 栈的应用4——递归函数的非递归形式(主讲阿克曼函数的非递归形式)
递归 函数自己调用自己 如求阶乘函数: int jiecheng(int n) {if(n==0)return 1;if(n==1)return 1;else return n*jiecheng(n- ...
最新文章
- Deformable ConvNets--Part2: Spatial Transfomer Networks(STN)
- 项目经理的超越(三)人际优先,做事上的超越
- 《基于张量网络的机器学习入门》学习笔记7
- OpenGL uniform变量赋值的三种方法
- mat opencv 修改roi_设置图片ROI(OpenCV学习笔记之二)
- aws lambda_如何通过在本地模拟AWS Lambda来加速无服务器开发
- 梯度下降算法(GD)—收敛速率证明
- 计算机网络第七版课后答案(谢希仁版)
- Android Camera高级特性——手动对焦
- Xcelsius调用CR报表,总是弹出输入参数页面
- Xmanager中的Xbrowser怎么使用?
- 网上经常听到的“终端”指的什么?
- 为什么用python画图_怎么用python画图
- 手机裁剪音频的软件有哪些?来看看这几个吧
- 从Flink SQL doesn't support consuming update and delete changes 错误谈起
- 批量修改文件名 大量文件名称一键替换文字
- PHP打包下载多文件
- mysql数据库如何导出表和数据
- The Movies Dataset(电影数据集)
- 关于计算机的英语作文带翻译,关于网络的英语作文带翻译
热门文章
- 2016-6-3Ajax异步复习
- jQuery弹出窗口完整代码
- 【暴力枚举】LeetCode 78. Subsets
- 如何理解 scanf(%*s,str)?
- 关于max(X,Y),min(X,Y)
- 访问Cache和主存的效率计算问题
- 对 BatchNormalization 中 Internal Convariate Shift 的理解
- PAT 1059 Prime Factors[难]
- 2018阿里-研发工程师JAVA Software Engineer, Java
- 软件测试之图覆盖(作业3)