带有BigInteger支持的Java实现Ackermann函数

时间:2019-06-12 18:09:01

标签: java recursion stack-overflow ackermann

我正在获取以下代码的StackOverflowError(线程“ main” java.lang.StackOverflowError中的异常)。但是该程序对于m = 3,n = 3(或其他较低值)可以正常工作,但对于m = 4和n = 2或3则不能正常工作。

public class AckermannFunction
{
   static BigInteger One = BigInteger.ONE;

   static BigInteger Zero = BigInteger.ZERO;

   static BigInteger ackmnFun(BigInteger m, BigInteger n)
   {
      if (m.equals(Zero))
         return n.add(One);

      if (n.equals(Zero))
         return ackmnFun(m.subtract(One), One);

      return ackmnFun(m.subtract(One), ackmnFun(m, n.subtract(One)));
   }

   public static void main(String[] args)
   {
      BigInteger m = new BigInteger("4");
      BigInteger n = new BigInteger("3");

      System.out.println(ackmnFun(m, n));

   }
}

我了解有太多的递归调用。有什么办法可以摆脱这个错误?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以将其视为动态编程问题,而无需从头开始进行递归处理,并从下至上构造一个值表。然后,您无需进行递归调用,只需引用表即可创建下一个条目。

答案 1 :(得分:0)

我自己找到了解决问题的方法。我想和你分享。

由于Ackermann函数甚至以非常低的m&n值进行了多次调用,所以我这样做了,因此我添加了一些终止条件,直到m = 3和n = 3(以最小化递归调用)。和技巧起作用。我通过运行原始的递归函数找到了初始值,然后将所有这些都添加为终止条件。

程序立即在几秒钟内找到Ackermann(4,2)。答案很长,包含19729个十进制数字。