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相关推荐

  1. Ackerman函数 非递归 java_Ackerman函数的非递归实现.

    在网上看到了一些人在找这个Ackerman函数 , 不知道这个函数的实际含义,首先看到了他的递归形式: 注释部分是分析后的结果. int rackerman(int m,int n) { if(m== ...

  2. 递归和非递归实现规律函数

    1.问题 A(n) = n / (2 * n + 1) B1 = 2 + A1; B2 = 2 + A1 * (2 + A2); B3 = 2 + A1 * (2 + A2 * (2 + A3)); ...

  3. python非递归前序遍历二叉树_Python非递归实现二叉树的后续遍历

    leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...

  4. mysql 实现非递归树_二叉树的非递归前序,中序,后序遍历算法

    #include #include struct tree { char data; struct tree *lchild; struct tree *rchild; }; typedef stru ...

  5. 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树

    import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...

  6. java 非递归求二叉树高度_非递归算法实现二叉树高度

    思路: 嘻嘻,请读者自己手动模拟.博主这里不知道怎么说. 拓展: 该算法思路也适用于 (1)每层的结点个数 (2)树的最大宽度 (3)节点位于某一层 int height(BiTree T){ if( ...

  7. 3. ackerman函数的递归实现算法用java语言_ackerman函数递归算法

    5-2 已知 Ackerman 函 5-1 已知 A[n]为整数数组,试写出实现下列运算的递归算法: (1) 求数组 A 中的最大整数. (2) 求 n 个整数的和. (3) 求 n...... 2 ...

  8. C++第七次作业(函数_递归与非递归_多文件)

    文章目录: 一:C++递归与非递归实现整数的阶乘 代码实现 运行结果 二:C++递归与非递归实现Fibonacci数列的计算:a0=1; a1=1; a2=a0+a1; a3=a1+a2; ..... ...

  9. 栈的应用4——递归函数的非递归形式(主讲阿克曼函数的非递归形式)

    递归 函数自己调用自己 如求阶乘函数: int jiecheng(int n) {if(n==0)return 1;if(n==1)return 1;else return n*jiecheng(n- ...

最新文章

  1. Deformable ConvNets--Part2: Spatial Transfomer Networks(STN)
  2. 项目经理的超越(三)人际优先,做事上的超越
  3. 《基于张量网络的机器学习入门》学习笔记7
  4. OpenGL uniform变量赋值的三种方法
  5. mat opencv 修改roi_设置图片ROI(OpenCV学习笔记之二)
  6. aws lambda_如何通过在本地模拟AWS Lambda来加速无服务器开发
  7. 梯度下降算法(GD)—收敛速率证明
  8. 计算机网络第七版课后答案(谢希仁版)
  9. Android Camera高级特性——手动对焦
  10. Xcelsius调用CR报表,总是弹出输入参数页面
  11. Xmanager中的Xbrowser怎么使用?
  12. 网上经常听到的“终端”指的什么?
  13. 为什么用python画图_怎么用python画图
  14. 手机裁剪音频的软件有哪些?来看看这几个吧
  15. 从Flink SQL doesn't support consuming update and delete changes 错误谈起
  16. 批量修改文件名 大量文件名称一键替换文字
  17. PHP打包下载多文件
  18. mysql数据库如何导出表和数据
  19. The Movies Dataset(电影数据集)
  20. 关于计算机的英语作文带翻译,关于网络的英语作文带翻译

热门文章

  1. 2016-6-3Ajax异步复习
  2. jQuery弹出窗口完整代码
  3. 【暴力枚举】LeetCode 78. Subsets
  4. 如何理解 scanf(%*s,str)?
  5. 关于max(X,Y),min(X,Y)
  6. 访问Cache和主存的效率计算问题
  7. 对 BatchNormalization 中 Internal Convariate Shift 的理解
  8. PAT 1059 Prime Factors[难]
  9. 2018阿里-研发工程师JAVA Software Engineer, Java
  10. 软件测试之图覆盖(作业3)