学习Java递归,Ackerman函数

学习Java递归,Ackerman函数,java,recursion,Java,Recursion,我正在用Java编写一个递归函数。我在5月23日的递归行遇到一个错误 如果有人能指出问题所在,非常感谢 -凯尔 您已超过最大递归深度。这是Ackermann函数的特征之一。:) 如果用较小的数字调用它,比如Ack(3,3),那么它不会溢出堆栈 可以增加Java的递归深度限制,但这不一定是一个好的解决方案。这可能是一个转换程序的练习,使其不使用Java的内置调用堆栈,而是跟踪数据结构(可能是堆栈)中的每个调用。您还可以使用memonization,在这里您记录函数调用的结果,这样您就不必反复计算相

我正在用Java编写一个递归函数。我在5月23日的递归行遇到一个错误

如果有人能指出问题所在,非常感谢

-凯尔


您已超过最大递归深度。这是Ackermann函数的特征之一。:)

如果用较小的数字调用它,比如
Ack(3,3)
,那么它不会溢出堆栈


可以增加Java的递归深度限制,但这不一定是一个好的解决方案。这可能是一个转换程序的练习,使其不使用Java的内置调用堆栈,而是跟踪数据结构(可能是堆栈)中的每个调用。您还可以使用memonization,在这里您记录函数调用的结果,这样您就不必反复计算相同的结果

您需要将堆栈变大:

对于较大的堆栈,它运行时没有stackoverflow,但给出0

编辑:您的代码是错误的,这就是它给出错误的原因。尝试完全按照定义重写代码:

    //I assume that you check that n and m are non-negative before you run this
    if (m == 0) {
         return n + 1;
    } else if (n == 0) {
        return Ack(m - 1, 1);
    } else {
        return Ack(m - 1, Ack(m, n - 1));
    }

另外,不要因为我发布了家庭作业问题的源代码而责怪我。我相信学习编程的最好方法是阅读和理解别人的代码。

前面有一个返回,你不需要“其他人”

if (m == 0)    return n + 1;
if (n == 0)    return ack (m - 1, 1);
return ack (m - 1, ack (m, n - 1));

Eclipse需要“return n”的原因是,否则您将有一个不返回任何内容的部分。您的方法的形式为:if(a)else if(b)。。。但是如果a或b都不是真的,那么你就在这两个块之外了。我喜欢它是java.lang.StackOverflowErroradditional point,java的方法名以小写开头。它应该是
publicstaticintack(intm,in n)
实际上,(3,3)的正确输出是65536。我认为(3,4)应该是125?我认为可能有其他错误,我认为值(3,4)的答案应该是125,足够小,不需要更大的堆栈处理(现在)。
    //I assume that you check that n and m are non-negative before you run this
    if (m == 0) {
         return n + 1;
    } else if (n == 0) {
        return Ack(m - 1, 1);
    } else {
        return Ack(m - 1, Ack(m, n - 1));
    }
if (m == 0)    return n + 1;
if (n == 0)    return ack (m - 1, 1);
return ack (m - 1, ack (m, n - 1));