题目描述
众所周知,阿克曼函数在理论计算机科学领域占有重要地位。然而,另一方面,函数的急剧快速增长使得阿克曼函数的值难以计算。阿克曼函数可以递归定义如下:
现在Eddy给你两个数字:m和n,你的任务是计算A(m,n)的值。这是一个很简单的问题,如果你解决了这个问题,你会得到一个奖品(Eddy会邀请你去hdu餐厅吃晚饭)。
输入的每一行将有两个整数,即m,n,其中0 < m <= 3。注意,当m < 3时,n可以是小于1000000的任何整数,而m = 3时,n的值限制在24以内。输入在文件结尾处终止。
对于m,n的每个值,打印出A(m,n)的值。
样例
1 3
2 4
5
11
算法1
由题意可知m只能取1,2,3(不用管m==0时)
m=1,A(m,n)=n+2
m=2,A(m,n)=2*n+3
m=3,A(m,n)=2的n+3次方-3,也相当于下面两行
//相当于int s=5;
// for(int i=1; i<=y; i++) s=s*2+3
下面图片是29,不是19
参考文献
原文链接:https://blog.csdn.net/gray_1566/article/details/24902443?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-14.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-14.control
C++ 代码
//打表代码
#include<iostream>
using namespace std;
int A(int m,int n) {
if(m==0) return n+1;
if(m>0&&n==0) return A(m-1,1);
return A(m-1,A(m,n-1));
}
int main() {
int m,n;
while(cin >> m >> n) {
cout << A(m,n) << endl;
}
return 0;
}
//实际代码
#include <iostream>
using namespace std;
int A(int x,int y) {
if(x == 1) return y + 2;
else if(x == 2) return 2*y + 3;
else {
int s = 5;
for(int i = 1; i <= y; i++) s = s*2 + 3;
return s;
}
}
int main() {
int a,ans;
int m,n;
while(cin >> m >> n) {
ans = A(m , n);
cout << ans << endl;
}
}