【问题标题】:Finding the value of Recursive Ackermann Function寻找递归阿克曼函数的值
【发布时间】:2020-09-21 20:05:36
【问题描述】:

我的代码有什么问题?它不会返回正确的答案,

#include <iostream>
using namespace std;

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

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

    return ack(m - 1, ack(m, n - 1));

}

int main()
{
    cout << ack(4, 1) << endl;
    return 0;
}

这是输出:

谢谢。

【问题讨论】:

  • StackOverflow - 我猜你的递归太深了。
  • 我重写了without recursion。它变得有点慢,但不应该崩溃。在 Godbolt 上运行太慢了,所以你必须在你的机器上尝试一下。确保开启最大优化。
  • 不知道。我从未使用过 Code::Blocks。如果您有基于gccclang 的编译器,-O3 很常见。但是,我不相信优化可以解决这个问题,因为它可能无法处理您在函数中抛出的所有输入。如果值在编译时已知,则可能非常成功,但如果在运行时给出值,则不会。
  • 它有效,非常感谢。 :)
  • 你可以同时使用记忆和递归。

标签: c++ recursion


【解决方案1】:

使用 C 编译器而不是 C++ 编译它,您的 ack() 函数在大约 20 秒内正确返回 65533。

使用来自RosettaCode 的递归算法,它不像您的那样双重递归,在大约 10 秒内返回正确的值:

int ack(int m, int n)
{
    for (; m > 0; m--) {
        n = (n == 0) ? 1 : ack(m, n - 1);
    }

    return n + 1;
}

由于您不会使用此代码达到更高的阿克曼值,因此我认为更快没有意义。

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2015-03-04
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多