C++算法 数据结构 非递归实现阿克曼函数,出错了,问题在哪


int ackermann2(int m, int n) {
    if (m < 0 || n < 0) {
        return -1;
    }
    stack st;
    int f=0;
    st.push(ack(m, n, 0));
    while (!st.empty()) {
        if (st.top().m == 0) {
            st.top().ret = st.top().n + 1;
        }
        else if (st.top().n == 0) {
            st.top().n = 1;
            st.top().m--;
        }
        else {
            st.push(ack(st.top().m--, st.top().n - 1,0));
        }
        if (st.top().ret != 0) {
            int tmp = st.top().ret;
            st.pop();
            st.top().n = tmp;
            f = tmp;
        }
    }
    return f;
}

https://blog.csdn.net/weixin_59408044/article/details/127217600

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7416798
  • 这篇博客也不错, 你可以看下C++ 输入一个数字,逆序输出
  • 除此之外, 这篇博客: C++基础(命名空间,输入输出流,缺省参数,函数重载)中的 作用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    C++的引入是在C语言的基础上的,所以引入的东西也都是C语言所缺陷的,在C语言中没有命名空间这一说法,使得我们无法使用C语言提供的函数名作为参数名,举一个栗子:

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
    	int printf = 10;
    	printf("%d", printf);
    }
    

    这一段程序是不正确的程序,由于printf是已经在stdio.h中定义过的函数名,不能再使用它作为变量名了。
    在一个公司中,一个工程往往都是好多人一起来完成的,这就可能出现,两个人定义了相同名称的变量,但是他们都不知道造成一定的麻烦,因此C++引入命名空间这一概念,来使得可以定义相同名称的变量而不会产生冲突

  • 您还可以看一下 王桂林老师的<3>华为工程师 ,带你实战C++(2018版)课程中的 02-C++类型增强小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    阿克曼函数是用来表示超越函数的一个重要例子,公式为: A(m, n) = n+1 (m=0)
    A(m, n) = A(m-1, 1) (m>0, n=0)
    A(m, n) = A(m-1, A(m, n-1)) (m>0, n>0)

    针对该问题,我们需要使用非递归的C++算法和数据结构来实现阿克曼函数。

    首先,我们需要注意使用递归实现阿克曼函数时,由于递归会不断压栈,会造成内存消耗过大的问题,因此使用非递归方式实现可以降低内存消耗。

    接下来,我们可以考虑使用Stack(栈)这种数据结构来实现非递归解法。

    以下是一个可能的解决方案:

    #include<iostream> 
    #include<stack>   
    using namespace std;  
    int A(int m, int n)  {  
        stack<int> s;  
        while (true)  
        {  
            if (m == 0)  
            {  
                n = n + 1;  
                if (s.empty())  
                  break;   
                m = s.top();  
                s.pop();  
            }  
            else if (n == 0)  
            {  
                n = 1;  
                m--;  
            }  
            else    
            {  
                s.push(m - 1);  
                n--;  
            }  
        }  
        return n;  
    }  
    int main() {  
        for (int m = 0; m <= 3; ++m)  
            for (int n = 0; n <= 8; ++n)  
                cout<<"A("<<m<<","<<n<<") = " << A(m, n) << endl;    
        return 0; 
    }    
    

    上述代码中使用了一个Stack来模拟递归过程,当出现n=0时,我们执行同样的操作,只不过是将m-1入栈,等待之后的处理。当遇到n不为0时,我们只更新n的值即可,不需要将m入栈。

    在完成代码编写之后,我们需要进行调试和优化,以确保代码能够正确高效地执行。我们可以使用调试工具,如Visual Studio IDE的调试工具,找出代码中的错误,并进行优化,例如使用智能指针来防止内存泄漏等。另外,我们也可以使用代码注释和命名来提高代码的可读性和可维护性。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^