B阿克曼函数
阿克曼(Arkmann)函数 A(m,n) 中,m与n的定义域是非负整数且本题中m<=3,n<=16。
函数的定义为:
以上结果是使用下面的递归函数跑出来的结果,超时(time limit exceed=TLE)。
超时代码
#include<iostream>
using namespace std;
int akm(int m,int n){
if(m==0) return n+1;
if(m>0&&n==0) return akm(m-1,1);
if(m>0&&n>0) return akm(m-1,akm(m,n-1));
}
int main(){
int m,n;
cin>>m>>n;
cout<<akm(m,n)<<endl;
}
解析
看见别人用以上代码打表,然后推出来公式。
规律如下
a
k
m
(
0
,
n
)
=
n
+
1
akm(0,n)=n+1
akm(0,n)=n+1
a
k
m
(
1
,
n
)
=
n
+
2
akm(1,n)=n+2
akm(1,n)=n+2
a
k
m
(
2
,
n
)
=
2
n
+
3
akm(2,n)=2n+3
akm(2,n)=2n+3
a
k
m
(
3
,
n
)
=
2
n
+
3
−
3
akm(3,n)=2^{n+3}-3
akm(3,n)=2n+3−3
ac代码
函数pow
在头文件cmath
中
#include<iostream>
#include<cmath>//pow函数
using namespace std;
int main(){
int m,n;
cin>>m>>n;
if(m==0) cout<<n+1<<endl;
if(m==1) cout<<n+2<<endl;
if(m==2) cout<<2*n+3<<endl;
if(m==3) cout<<pow(2,n+3)-3<<endl;
}
非递归解法待补充