ackerman函数

                    n+1                            , m==0

akm(m,n) =    akm(m,1)                    , m!=0 && n==0 

                    akm(m-1,akm(m,n-1))  , m!=0 && n!=0 


  

View Code
 1 #include <iostream>
2 #include "seq_stack.h"
3 using namespace std;
4
5 int akm_rec(int m, int n)
6 {
7 if(m == 0)
8 return n+1;
9 else if(n == 0)
10 return akm_rec(m-1, 1);
11 else
12 return akm_rec(m-1, akm_rec(m, n-1));
13 }
14
15 struct Dual
16 {
17 int m;
18 int n;
19 Dual(){};
20 Dual(int x, int y)
21 {
22 m = x;
23 n = y;
24 }
25 void operator=(Dual du)
26 {
27 m = du.m;
28 n = du.n;
29 }
30 };
31 int akm_unrec(int m, int n)
32 {
33 int akm;
34 seqStack<Dual> st;
35 Dual du(m, n);
36 st.Push(du);
37 while(true){
38 st.Pop(du);
39 if(du.m != 0 && du.n == 0){
40 //akm(m,n)=akm(m-1,1)
41 st.Push(Dual(du.m-1,1));
42 }else if(du.m != 0 && du.n != 0){
43 //akm(m,n)=akm(m-1,akm(m,n-1))
44 st.Push(Dual(du.m-1,du.n));
45 st.Push(Dual(du.m,du.n-1));
46 }else{//m==0
47 //akm(m,n)=n+1
48 akm = du.n + 1;
49 if(st.IsEmpty())
50 break;
51 else{
52 st.Pop(du);
53 st.Push(Dual(du.m,akm));
54 }
55 }
56 }
57 return akm;
58 }
59
60 int main()
61 {
62 int m, n;
63 cout << "enter m and n to calculate akm(m, n):";
64 cin >> m >> n;
65 cout << "akm_rec(" << m << "," << n << ")=" << akm_rec(m, n) << endl;
66 cout << "akm_unrec(" << m << "," << n << ")=" << akm_unrec(m, n) << endl;
67 return 0;
68 }

  

posted @ 2011-10-12 22:59  crazykeyboard  阅读(294)  评论(0编辑  收藏  举报