1. 程式人生 > 其它 >棧和佇列實現Ackermann函式

棧和佇列實現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; }