金山云笔试题: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;
    }
}

原文地址:https://www.cnblogs.com/haimishasha/p/11610405.html

时间: 2024-11-12 19:14:58

金山云笔试题:AKM函数的相关文章

笔试题: 不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数

笔试题: 不使用中间变量求const字符串长度,即实现求字符串长度库函数strlen函数. 函数接口声明如下:int my_strlen(const char *p); strlen函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'. 而返回的长度大小不包括'\0'. #include <stdio.h> #include <assert.h> //使用中间变量 //int my_strlen(const  char *str) //{ //   ass

2014金山网络实习生招聘——Android笔试题

一.请用伪代码描述,在Android系统上启动和停止Service有哪些方法,并说明这些方法导致Service的生命周期有何不同? 二.输入一个正整数 X,以2*X,4*X,8*X的方式递增,当大于10000时,再倒叙输出已经输出的整数.[要求:不得使用循环和其他任何变量(包含局部变量)辅助] 比如 X= 2468,输出结果为: 2468,4936,9872,19744,19744,9872,4936,2468 三.有两个字符串由不同的字母组成,一长一短,长的为A,短的为B.设计一个算法,如果所

经典笔试题:用C写一个函数测试当前机器大小端模式

“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 1 #include <stdio.h> 2 3 union test 4 { 5 int a; 6 char b; 7 }; 8 9 int endian_test(void) 10 { 11 union test t1; 12 t1.a = 1; 13 return t1.b; 14 } 15 16 int main(void) 17 { 18 int i =

前端笔试题:拍扁多维数组、提取URL中的参数变成对象、实现string的trim()函数、判断Email地址、16进制颜色转rgb格式

(1)拍扁数组 这是一个著名互联网公司今天的前端笔试题:多维数组维数不定,如[2,4,1,[2,3,4,[1,2],5,3],3,8]拍扁为[2,4,1,2,3,4,1,2,5,3,3,8].维数不定,应该要用递归: 答案: function flatten(arr){ var arrLength=arr.length; for(var i=0;i<arrLength;i++){ if(arr[i].constructor==Array){ arr.splice(i,1,flatten(arr[

关于函数和变量同名时(笔试题)

以往关注比较多的是变量提升,把变量和函数同名时,函数提升的规则不小心给漏掉了,唉,失去一分,今日笔试题 console.log(a) var a; console.log(a) a = 10 console.log(a) function a() { let c = 1; } console.log(a) 结果如下图所示: 1) 变量声明存在提升,函数声明存在提升,但函数声明比变量声明更置顶 2) 声明过的变量不会重复声明 原文地址:https://www.cnblogs.com/Tiboo/p

整理一些笔试题(要求手写代码的)

1.将一整数逆序后放入一数组中(要求递归实现) void convert(int *result, int n) { if(n>=10) convert(result+1, n/10); *result = n%10; } int main(int argc, char* argv[]) { int n = 123456789, result[20]={}; convert(result, n); printf("%d:", n); for(int i=0; i<9; i+

PHP笔试题总结1

---恢复内容开始--- 1.1    PHP中判断变量的相关函数 1.2    strlen( )与mb_strlen( )的作用分别是什么(新浪网技术部) strlen 和mb_strlen 都是用于获取字符串长度的,其中strlen只针对单字节编码字符,也就是说它计算的是字符串的总字节数,如果是多字节编码,如gbk和utf8,使用strlen得到的不是字符串的个数,而是该字符串的总字节数,可以使用mb_strlen获取其字符个数,使用mb_strlen要注意两点,一是要开启mbstring

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

腾讯web前端开发工程师笔试题及答案

1. 如何实现事件委托? 首先要知道什么是事件委托. 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少遇到这么多li的情况),为每个li添加事件侦听就会对页面性能产生很大的影响. 就像下面这段代码: <!DOCTYPE HTML><html><head><meta charset="utf-8" /><ti