Ackerman函数A(n,m)有两个独立变量m>=0和n>=0,定义如下:
A (1,0)=2    
A (0,m)=1    m>=0
A (n,0)=n+2  n>=2
A (n,m)=A(A(n-1,m),m-1) n,m>=1
我的程序:public class Ackerman {
private int first;
private int last;
public Ackerman(int first,int last)
{
this.first = first;
this.last = last;
}
private int Ack(int first,int last)
{
if(first == 1 && last == 0)
{
return 2;
}
else if(first == 0 && last >= 0)
{
return 1;
}
else if(first >= 2 && last == 0)
{
return first+2;
}
else if(first >= 1 && last >= 1 )
{
return Ack(Ack(first-1,last),last-1);
}
else return 0;
}
private void Print()
{
System.out.println("Ackerman["+first+","+last+"]"+"="+Ack(first,last));
}
public static void main(String[] args)
{
Ackerman Ack = new Ackerman(3,3);
Ack.Print();
}
}当要求解的是A[3,3]和小于(3,3)组合时没错误,当要求解是A[4,4]或者以上的时候就显示有错误了,请指教~~~~

解决方案 »

  1.   

    StackOverflowError是这个异常
    else if(first >= 1 && last >= 1 )
    {
    System.out.println(first+";"+last);
    return Ack(Ack(first-1,last),last-1);
    }
    自己调看一下就知道了,程序有问题,递归没有终止的条件
      

  2.   

     怎么会没有终止条件呢?按照上面的条件,递归始终会回到第一和第二的条件呀,然后RETURN不就跳出了?
      

  3.   

    我运行lz的程序抛出java.lang.StackOverflowError,是大量的产生实例且该实例又不能被回收而导致的栈溢出。 
    Ack(Ack(first-1,last),last-1); 
    你递归的层数太多了。
      

  4.   

    要知道阿克曼函数的增长速度是惊人的,A(3,n) = (2^(2^(...2^n)...),4以上就不能想象了。