我服了,想了半天都没有想出来怎么实现这个算法,最要命的是网上下了个程序自己又看不懂!!!!!!难道是老了?
/*
* Ackermann函数可以递归地定义如下:
* n+1 m=0
* A(m,n)={A(m-1,1) m>0,n=0
* A(m-1,A(m,n-1))m>0,n>0
* 试设计一个计算A(m,n)的动态规划算法,该算法只占用O(m)空间。(提示:用两个
* 数组val[0:m],ind[0:m],使得对任何i有val[i]=A(i,ind[i]))
*/
package dynamic_progranmming;
public class Ackermann {
public Ackermann() {
// TODO Auto-generated constructor stub
}
public static int ack(int m,int n)
{
int i,val[],ind[],k=0;
if(m==0)
{
return n+1;
}
val=new int[m+1];
ind=new int[m+1];
for(i=0;i<=m;i++)
{
val[i]=-1;
ind[i]=-2;
}
val[0]=1;
ind[0]=0;
while(ind[m]<n)
{
val[0]++;
ind[0]++;
for(i=0;i<m;i++)
{
if(ind[i]==1&&ind[i+1]<0)
{
val[i+1]=val[0];
ind[i+1]=0;
}
if(val[i+1]==ind[i])
{
val[i+1]=val[0];
ind[i+1]++;
}
System.out.println(k++);
}
}
return val[m];
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(ack(4,5));
}
}