我正在获取以下代码的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));
}
}
我了解有太多的递归调用。有什么办法可以摆脱这个错误?
谢谢。
答案 0 :(得分:1)
您可以将其视为动态编程问题,而无需从头开始进行递归处理,并从下至上构造一个值表。然后,您无需进行递归调用,只需引用表即可创建下一个条目。
答案 1 :(得分:0)
我自己找到了解决问题的方法。我想和你分享。
由于Ackermann函数甚至以非常低的m&n值进行了多次调用,所以我这样做了,因此我添加了一些终止条件,直到m = 3和n = 3(以最小化递归调用)。和技巧起作用。我通过运行原始的递归函数找到了初始值,然后将所有这些都添加为终止条件。
程序立即在几秒钟内找到Ackermann(4,2)。答案很长,包含19729个十进制数字。