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
不知道你这个问题是否已经解决, 如果还没有解决的话:C++的引入是在C语言的基础上的,所以引入的东西也都是C语言所缺陷的,在C语言中没有命名空间这一说法,使得我们无法使用C语言提供的函数名作为参数名,举一个栗子:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int printf = 10;
printf("%d", printf);
}
这一段程序是不正确的程序,由于printf是已经在stdio.h中定义过的函数名,不能再使用它作为变量名了。
在一个公司中,一个工程往往都是好多人一起来完成的,这就可能出现,两个人定义了相同名称的变量,但是他们都不知道造成一定的麻烦,因此C++引入命名空间这一概念,来使得可以定义相同名称的变量而不会产生冲突
阿克曼函数是用来表示超越函数的一个重要例子,公式为: 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的调试工具,找出代码中的错误,并进行优化,例如使用智能指针来防止内存泄漏等。另外,我们也可以使用代码注释和命名来提高代码的可读性和可维护性。