Ackerman函数(递归与非递归算法实现)
Ackerman函数
阿克曼函数是非原始递归函数的例子;它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高。
计算Ackerman(m,n)函数递归算法与非递归算法(利用顺序栈)
import java.util.Scanner;public class SequenceStack<T> {public static void main(String[] args) {Scanner scanner =new Scanner(System.in);System.out.print("Enter the m and n -Ack(m,n): ");int m = scanner.nextInt();int n = scanner.nextInt();System.out.printf("Ack(%d, %d) = %d \n",m,n,ackerman(m,n));}private static int ackerman(int m, int n) { //非递归算法SequenceStackElem e;SequenceStack<SequenceStackElem> stack = new SequenceStack<>(100);//初始栈容量为100,这个值可以随意取。e = new SequenceStackElem(m, n);stack.push(e);do {while (stack.getTop().m != 0) {while (stack.getTop().n != 0) {e = new SequenceStackElem(stack.getTop().m, stack.getTop().n - 1);stack.push(e);}stack.getTop().m -= 1;stack.getTop().n = 1;}if (!stack.isEmpty()) {e = stack.pop();stack.getTop().m -= 1;stack.getTop().n = e.n + 1;}} while (stack.getSize() != 1 || stack.getTop().m != 0);return stack.getTop().n + 1;}/*public static int ackerman(int m,int n){ //递归算法int result;if (m==0){return n+1;}else if (m!=0&&n==0){return ackerman(m-1,1);}else{return ackerman(m-1,ackerman(m,n-1));}}*/private int capacity;private int top;private Object[] elements;public SequenceStack(int capacity) {this.capacity = capacity;top = -1;elements = new Object[capacity];}public int getSize() {return top + 1;}public boolean isEmpty() {return top == -1;}public boolean isFull() {return top == capacity - 1;}public void push(T e) {if (getSize() == capacity) {expandSpace();}elements[++top] = e;}private void expandSpace() { //该操作也可以自己写for循环实现元素复制;Object[] bigElements = new Object[capacity * 2];System.arraycopy(elements, 0, bigElements, 0, elements.length);elements = bigElements;capacity *= 2;}public T pop() {if (isEmpty()) {throw new RuntimeException("The stack is empty.");}/*T element = getTop();top--;*/return (T) elements[top--];}public T getTop() {if (isEmpty()) {throw new RuntimeException("The stack is empty.");}return (T) elements[top];}public void display() {if (isEmpty()) {throw new RuntimeException("The stack is empty.");}for (int i = top; i >= 0; i--) {System.out.print(elements[i] + "\t");}System.out.println();}
}class SequenceStackElem {int m;int n;public SequenceStackElem(int m, int n) {this.m = m;this.n = n;}
}
Ackerman函数(递归与非递归算法实现)相关推荐
- 全排列之递归与非递归算法实现总结
全排列之递归与非递归算法实现总结 递归实现 常见的是基于交换的,原理:从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}. ...
- Java实现折半查找(二分查找)的递归和非递归算法
Java二分查找实现,欢迎大家提出交流意见. /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: * 1.要求所查找的数组已有序,并且其 ...
- 数据结构二叉树中序遍历递归和非递归算法
2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...
- 汉诺塔递归与非递归算法
问题描述: 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这 ...
- 斐波那契数与二分法的递归与非递归算法及其复杂度分析
1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏 ...
- Akm函数递归与非递归解法
如下是Akm函数的递归算法,根据Akm函数的递归定义就可以得出,请参考: int AkmRecur(int m, int n) {if (m == 0)return n + 1;else if (n ...
- 汉诺塔问题的递归和非递归算法
汉诺塔问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 ...
- java递归整数逆序,将一个整数逆序输出,分别给出递归和非递归算法 | 学步园...
整数的逆序输出,递归 #include "stdafx.h" #include using namespace std; void reverse (int x){ int t_r ...
- 二叉树交换左右子树的递归与非递归算法
在学习二叉树的相关基本操作时,很多时候都需要运用递归,递归在学习的数据结构与算法中显得非常重要. 递归算法 recursion algorithm在计算机科学中是指一种通过重复将问题分解为同类的子问题 ...
最新文章
- java学习规划-转的
- portlet java_探秘企业门户开发:Java Portlet入门(2)
- 叮!您有一份来自平安人寿的真AI情书
- python之用循环实现五子棋小程序
- Java笔记-异常机制中try(...)中括号的用法
- 基于Minio和Thumbor搭建独立图片服务
- 【java笔记】模拟B/S服务器
- 计算机网络—TCP协议
- vue项目中出现cannot get/的解决办法
- VS2015安装教程
- Win10家庭中文版 如何启用组策略
- autoCAD 使用选择集
- google搜索语法与技巧
- 微软自带比对神器,快速比对两个表格-高效好用又简单(99.9%的人没听说过)
- 从机械硬盘和固态硬盘的结构来看IO
- MySQL、Redis、MongoDB安装
- “新华三杯”全国大学生数字技术大赛预选赛备考资料
- 2022下半年软考合格标准是多少?你可知?
- 开源RISC-V处理器(蜂鸟E203)学习(三)低成本方案,成功运行hello word程序
- vue+element-ui+js页面打印(打印elementui的table)
热门文章
- 《计算机组成与系统结构(第二版) 裘雪红 李伯成 西安电子科技大学出版社》课后习题答案(带解析)(六)
- 李宁——一切皆有可能
- 孔雀石SDR入手体验
- 德国网上冲印公司Fotokasten计划进军中国市场
- 两大世界在线查毒网站 VirusTotal 和 VirSCAN
- CSDN高校——C1任务01—修改游戏存档
- 阅读笔记:《The Art, Science, and Engineering of Fuzzing: A Survey》
- 百家号写的文章为什么不被推荐?推荐量低阅读量低是什么原因?
- (附源码)基于SpringBoot小而学在线考试系统 毕业设计141507
- python投票程序