阿克曼函数(Ackermann)是非原始递归函数的例子。它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算。
接下来去找到项目的WebRot文件夹下面的WEB-INFI下面的webxml 文件,自己写上 <context-param>
<param-name>
<context-param>
<param-name>
contextConfigLocation
</param-name>
<param-value>
classpath:applicationContextxmls
</param-value>
</context-param>
</param-name>
<param-value>
classpath:applicationContextxml
</param-value>
从Ackermann函数的定义中可以看出,Ackermann函数可以看成关于n的一个函数序列,其中第0个函数返回n+1,而第m个函数则是将第m-1个函数对1迭代n+1遍。对较小的m,该函数为:
Ackermann(0,n)=n+1
Ackermann(1,n)=n+2
Ackermann(2,n)=2n+3
Ackermann(3,n)=2^(n+3)-3
Ackermann(4,n)=2^2^2^……^2-3,乘幂中共有n+3个2。
当m≥4,Ackermann函数的增长快得惊人。Ackermann(4,0)=13,Ackermann(4,1)=65533,Ackermann(4,2)=2^65536-3有19729位,而Ackermann(4,3)则即使是位数也不易估计。Ackermann(5,0)=65533,Ackermann(5,1)=Ackermann(4,65533)……
clear all
k=600;
m=65;
x(2)=110;
x(1)=20944pi/180;%%x(1)要计算它的三角函数值,转化为弧度
I=1:360;%%I的取值应该是角度吧,那把范围扩大
h=75;
I1=Ipi/180;%%i换成别的变量,避免和虚数的i混淆
%%
r=atan(m/(2h));
V=k-m/2-x(2)cos(x(1));
C=h-x(2)sin(x(1));
l2=sqrt(V^2+C^2);
%%
D=I1-x(1);%%换i为I1
B=sqrt(h^2+m^2);
M=x(2)^2+(k^2)/4+B^2-l2^2;
E=kB-(2x(2)B)cos(D);
F=((-2)x(2)B)sin(D);
X=(M-(x(2)k)cos(D))/sqrt(E^2+F^2);
Y=atan(F/E);
a=r-asin(X)+Y;
P=r+a;
H=x(2)k-(2x(2)B)sin(P);
G=(-2)x(2)Bcos(P);
T=(M-(kB)sin(P))/sqrt(H^2+G^2);
Z=atan(H/G);
J1=-x(1)-asin(T)+Z;%%同样把j换成别的符号表示
J=J1180/pi;
beta=acot(cot(I1)-600/1500);
betae=beta180/pi;
plot(I,J,'r-',I,betae,'g',I,I,'b')%%画到一幅图上
grid on
%%%%%%%%%%%%%%%%%%%%%%结果如图
Ackermann function
[词典][计] 阿克曼函数;
[例句]Estimation for the constrain of the actual parameter of Ackermann
function in recursive invocation
ACKERMANN函数递归计算中实参的约束范围估计
#include <stdioh>
int Ackermann(int m, int n)
{
if (m == 0) return n + 1;
if (n == 0) return Ackermann(m - 1, 1);
return Ackermann(m - 1, Ackermann(m, n - 1));
}
int main()
{
int m, n, a;
scanf("%d%d", &m, &n);
a = Ackermann(m, n);
printf("A(%d, %d) = %d\n", m, n, a);
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)