import java.util.Stack; class Ackermann { public static long ack_rek(long n,long m) { if (n==0) return m+1; else if (m==0) return ack_rek(n-1,1); else return ack_rek(n-1,ack_rek(n,m-1)); } /* * @(#)Ackermann.java 1.0 * Klaus Volbert, Oktober 2003 */ static final byte beginn=0; static final byte mitte=1; static final byte ende=2; public static long ack_it_KV(long n,long m) { longStack st=new longStack(); st.push(ende); st.push(n); st.push(m); st.push(beginn); byte pos; schleife: while (true) { pos=(byte)st.pop(); switch (pos) { case beginn: { m=st.pop(); n=st.pop(); if (n==0) { long next=st.pop(); st.push(m+1); st.push(next); continue schleife; } if (m==0) { st.push(n-1); st.push(1); st.push(beginn); continue schleife; } st.push(n); st.push(m); st.push(mitte); st.push(n); st.push(m-1); st.push(beginn); continue schleife; } case mitte: { long zwi=st.pop(); m=st.pop(); n=st.pop(); st.push(n-1); st.push(zwi); st.push(beginn); continue schleife; } case ende: { return st.pop(); } } return 0; } } /** * @author Norbert Sondag */ public static long ack_it_NS(long n,long m){ longStack stack = new longStack(); do{ if (n==-1) n=stack.pop(); if (n==0){ m=m+1; n=-1; } else if (m==0){ n--; m=1; } else{ stack.push(n-1); m--; } } while(n!=-1|!stack.empty()); return m; } /** * @author Mathias Raacke */ public static long ack_it_MR(long n, long m) { Stack nstack = new Stack(); nstack.push(new Long(n)); while (!nstack.empty()) { n = ((Long)nstack.pop()).intValue(); while (n > 0) { if (m == 0) { n--; m = 1; } else { nstack.push(new Long(n-1)); m--; } } m++; } return m; } public static void main(String args[]) { for (long i=0;i<4;i++) { for (long j=0;j<10;j++) { System.out.print("ack("+i+","+j+"): "+ack_rek(i,j)+" (rek), "); System.out.print(""+ack_it_KV(i,j)+" (it_KV), "); System.out.print(""+ack_it_NS(i,j)+" (it_NS), "); System.out.print(""+ack_it_MR(i,j)+" (it_MR)"); System.out.println(); } } System.out.println("ack(4,1)"); System.out.println(ack_it_KV(4,1)); } } class longStack { Stack stack; longStack() { stack=new Stack(); } public boolean empty() { return stack.empty(); } public void push(long l) { stack.push(new Long(l)); } public long pop() { try { return ((Long)stack.pop()).longValue(); } catch (Exception e) {} return -1; } }