#include #include using namespace std; int recAck(int, int); int stackAck(int, int); int main () { int i,j; for(i=0;i<4;i++) { for(j=0;j<5;j++) { cout << i << ", " << j << " = " << endl; cout << "\tstackAck " << stackAck(i,j) << endl; cout << "\treaAck " << recAck(i,j) << endl; } } return(0); } int recAck(int m, int n) { if (m == 0) { return(n+1); } if (n == 0) { return(recAck(m-1,1)); } return(recAck(m-1, recAck(m,n-1))); } int stackAck(int m, int n) { stack S; int rv; bool done = false; do { if (m == 0) { rv = n+1; if (!S.empty()) { n = rv; m = S.top(); S.pop(); } else { done = true; } } else if (n == 0) { //ack(m,0) -> Ack(m-1,1)->Ack(m-2,Ack(m-1,0)); if (m > 1) { S.push(m-2); m = m - 1; n = 0; } else { // ack(1,0) -> ack(0,1) = 2 rv = 2; if(!S.empty()) { n = rv; m = S.top(); S.pop(); } else { done = true; } } } else { // ack(m,n) -> Ack(m-1, Ack(m,n-1)); S.push(m-1); n = n - 1; } } while (!done); return(rv); }