金山云笔试题:AKM函数
1. 题目描述
/**
阿克曼(Ackmann)函数 【题目描述】
阿克曼(Ackmann)函数A(m,n)中,m,n定义域是非负整数(m<=3,n<=10),函数值定义为:
akm(m,n) = n+1; (m=0时)
akm(m,n) = akm(m-1,1); (m>0,n=0时)
akm(m,n) = akm(m-1,akm(m, n-1)); (m,n>0时) 【输入】输入m和n。 【输出】函数值。 【输入样例】2 3
【输出样例】9
*/
写出递归与非递归算法,并输出调用过程。
2. 代码实现递归和非递归
import java.util.Stack;
public class Main2 {
public static void main( String[] args ) {
System.out.println(AkmRecur(2, 3));
System.out.println(AkmNonRecur(2, 3));
}
//递归
public static int AkmRecur(int m, int n) {
if (m == 0)
return n + 1;
else if (n == 0)
return AkmRecur(m - 1, 1);
else
return AkmRecur(m - 1, AkmRecur(m, n - 1));
}
//非递归
public static int AkmNonRecur(int m, int n) {
Stack<Integer> sx = new Stack<Integer>();
Stack<Integer> sy = new Stack<Integer>();
int x = 0;
int y = 0;
sx.push(m);
sy.push(n);
while ((!sx.empty()) && (!sy.empty())) {
if (sx.peek() != 0 && sy.peek() == 0) {// m!=0 n==0
x = sx.peek();
y = sy.peek();
sx.pop();
sy.pop();
sx.push(x-1);
sy.push(1);
}else if (sx.peek() != 0 && sy.peek() != 0) {// m!=0 n!=0
while (sx.peek()!= 0 &&sy.peek()!= 0) {
x = sx.peek();
y = sy.peek()-1;
sx.pop();
sy.pop();
sx.push(x-1);
sy.push(-1);//如果m!=0&&n!=0, n暂时存放-1,代表是一个整体
sx.push(x);
sy.push(y);
}
} else {// m==0
y = sy.peek();
sx.pop();
if (sx.empty()){
return y + 1;
} else {
sy.pop();//弹出 y
sy.pop();//弹出-1
sy.push(y+1);
}
}
}
return -1;
}
}
金山云笔试题:AKM函数的更多相关文章
- 经典笔试题:用C写一个函数测试当前机器大小端模式
“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...
- 也许你需要点实用的-Web前端笔试题
之前发的一篇博客里没有附上答案,现在有空整理了下发出来,希望能帮助到正在找工作的你,还是那句话:技术只有自己真正理解了才是自己的东西,共勉. Web前端笔试题 Html+css 1.对WEB标准以及w ...
- js作用域之常见笔试题,运行结果题
笔试题中经常有运行结果题,而大多体型都是围绕作用域展开,下面总结了几种相关的题: 外层的变量函数内部可以找到,函数内部的变量(局部变量)外层找不到. function aaa() { var a = ...
- C/C++ 笔试题
/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...
- oracle 笔试题
ORACLE笔试题一.单选题1.在Oracle中,以下不属于集合操作符的是( ). A. UNION B. SUM C. MINUS D. INTERSECT2.在Oracle中,执行下面的语句:SE ...
- Java基础&笔试题
这些题目是近期我参加过的笔试题和一些我在网上选的部分题,在这里做笔记,认真去学习,更好的应对后面的招聘.有错误欢迎指出. 一.Java基础部分 1.指针在任何情况下都可进行>,<,> ...
- NET出现频率非常高的笔试题
又到了金三银四的跳槽季,许多朋友又开始跳槽了,这里我简单整理了一些出现频率比较高的.NET笔试题,希望对广大求职者有所帮助. 一..net基础 1. a=10,b=15,请在不使用第三方变量的情况下 ...
- ThoughtWorks西邮暑期特训营 -- JavaScript在线笔试题
ThoughtWorks 公司在西邮正式开办的只教女生前端开发的女子卓越实验室已经几个月过去了,这次计划于暑期在西邮内部开展面向所有性别所有专业的前端培训. 具体官方安排请戳:ThoughtWorks ...
- PHP笔试题(转载)
整理了一份PHP高级工程师的笔试题,问题很全面.嗯,基本上这些题都答得不错,那么你应该可以胜任大部分互联网企业的PHP职位了.下面直接上题. 1. 基本知识点 HTTP协议中几个状态码的含义:503, ...
随机推荐
- DirectShow 简介
一.DirectShow 简介 DirectShow(简称 DShow) 是一个 Windows 平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能.它支持多种多样的媒体文件格式,包括 ASF. ...
- 使用vue组件需要注意的4个细节
细节1:table(表格)中直接引用自定义组件出现的bug 如上图,tr本应在tbody中面,现在却是同级.造成的原因是h5规定table里必须有tbody,tbody中必须有tr, 当tbody中引 ...
- hibernate手动设置的id无效的原因与解决方法
在使用Hibernate的过程中,发现手动设置的id(主键)无效,Hibernate仍然会在保存(调用Hibernate提供的merge()方法)的时候自动生成一个随机的id. 经过调试发现问题出在了 ...
- laravel中的表单请求类型和CSRF防护(六)
laravel中为我们提供了绑定不同http请求类型的函数. Route::get('/test', function () {}); Route::post('/test', function () ...
- C#关闭多线程程序
Process[] processes = System.Diagnostics.Process.GetProcesses(); //获得所有进程 foreach (Process p in proc ...
- js键盘事件以及键盘事件拦截
一.键盘事件 onkeydown: 按下键盘时触发 onkeypress: 按下有值的键时触发 注意: onkeypress按下 Ctrl.Alt.Shift.Meta 这样无值的键,这个事件不会触发 ...
- Python3---AJAX---爬虫
前言 该文章主要介绍面对AJAX的网页如何爬去信息,主要作用是适合刚入门爬虫查看学习 修改时间:20191219 天象独行 首先,我们先介绍一下什么是AJAX,AJAX是与服务器交换数据并跟新部分网页 ...
- JS基础语法---函数练习part3---4个练习
练习1:求一个数字的阶乘 function getJieCheng(num) { var result = 1; for (var i = 1; i <= num; i++) { result ...
- /cygdrive/c/MinGW/bin/autoconf-2.68: line 501: /mingw/bin/autom4te-2.68: No such file or directory
出现如下错误 编译openssh的时候 # autoconf /cygdrive/c/MinGW/bin/autoconf-2.68: line 501: /mingw/bin/autom4te-2. ...
- 高并发高可、O2O、微服务架构用学习网站
高并发高可.O2O.微服务架构用学习网站 https://www.itkc8.com 非常感谢http://www.cnblogs.com/skyblog/p/5044486.html 关于架构,笔者 ...