通过 Java 在 BigInteger 支持下实现 Ackermann 函数

Implementing Ackermann Function by Java with BigInteger support

我收到以下代码的 WhosebugError(线程 "main" java.lang.WhosebugError 中的异常)。但是该程序适用于 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));

   }
}

我理解的递归调用太多了。有什么办法可以消除这个错误吗?

谢谢。

与其递归地执行此操作,不如将其视为一个动态规划问题,并自下而上构造一个 table 值。然后无需进行递归调用,只需引用 table 即可创建下一个条目。

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

因为即使 m 和 n 的值非常低,Ackermann 函数也会调用自己很多次,我所做的是,我添加了一些终止条件直到 m=3 和 n=3(以最小化递归调用).这些技巧奏效了。我通过 运行 原始递归函数找到初始值,然后将所有这些添加为终止条件。

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