62,612
社区成员
发帖
与我相关
我的任务
分享
public class TestRc {
/*
* 阿克曼函数定义如下:
akm(m,n)= n+1 if m=0
akm(m-1,1) if m!=0&&n=0
akm (m-1,akm(m,n-1)) if m!=0&&n!=0
*/
//这是递归算法
public static int akm(int m,int n)
{
if(m==0) return n+1;
if(m!=0 && n==0) return akm(m-1,1);
return akm(m-1,akm(m,n-1));
}
//这是设计的栈式算法(还没有进行精心的算法代码呢,只是一般的写写而已)。
static int[] s=new int[10000];//这是栈
static int top=-1;//栈指针
public static int akm1(int m,int n)
{
while(true)
{
if(m==0)
{
if(top<0){return n+1;}
else{ m=s[top--] ;n=n+1;}//出栈
}
else if(n==0){
m=m-1;n=1;
}else{
s[++top]=m-1;//进栈
n=n-1;
}
}//while
}
//仅仅从栈算法的代码上,就已经明显感到,进栈与出栈的次数明显少于递归,而且一次进栈的数据也少
public static void main(String[] args) {
// TODO Auto-generated method stub
long l1=System.currentTimeMillis();
for(int i=1;i<=100;i++) //才重复做了100次
{
akm(3,6); //这是递归
}
long l2=System.currentTimeMillis();
System.out.println("递归时间:"+(l2-l1));
long l3=System.currentTimeMillis();
for(int i=1;i<=100;i++) //才重复做了100次
{
akm1(3,6); //这是栈算法
}
long l4=System.currentTimeMillis();
System.out.println("栈算法时间:"+(l4-l3));
}
}