栈和队列实现Ackermann函数

一.前言

上一篇随笔提过Ackermann函数了,因此我直接给出栈和队列实现Ackermann函数的代码以及注释

#include "bits/stdc++.h"
using namespace std;
int ack(int m,int n)
{
    stack <int> s1;//存储每次处理节点结果
    stack <int> s2;//存储每次处理n的结果
    s1.push(m);
    s2.push(n);
    while(!s1.empty()){
        while(m != 0){//如果m不为0,则有下一步节点
            if(n == 0){//ackman函数某个节点出口
                m = m - 1;
                n = 1;
                s1.push(m);//把下一个节点存入栈
                s2.push(1);//存入下一个节点
            }
            else {//此时m不为0,且n不为0,根据ackman函数,我们需要进行下一次存点操作
                n = n - 1;
                s1.push(m - 1);
                s2.push(-1);//表明这是一个节点了
            }
        }
        n = n + 1;//出口,运算结果+1
        while(!s1.empty() && s2.top() != -1){//如果某个结果运算完了,则把运算过的步骤清除
            s1.pop();
            s2.pop();
        }
        if(!s1.empty()){
            m = s1.top();
            s2.pop();//进行下一个节点的运算
            s2.push(n);
        }
    }
    return n;
}
int main()
{
    cout << ack(1,2);
    return 0;
}

 

posted @ 2021-12-16 21:06  scannerkk  阅读(104)  评论(0)    收藏  举报