棧和佇列實現Ackermann函式
阿新 • • 發佈:2021-12-16
一.前言
上一篇隨筆提過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; }