递归方法最简单,不需要说明。
#include "stdafx.h"
#include <iostream>
#include "time.h"

using std::cout;
using std::endl;


unsigned int akm(unsigned int m , unsigned int n)

...{
if(m==0) return n+1;
else if( n==0 ) return akm(m-1,1);
else return akm(m-1, akm(m,n-1));

}


int main(int argc, char* argv[])

...{
time_t x, y;
x = time(0);
cout<<"akm(1, 0) = "<<akm(1,0)<<endl;
y = time(0);
cout <<"using time is " << difftime(y, x) <<endl;

return 0;
}
用for循环:
注意,申请的内存空间要足够大,反正我的计算机已经提出警告了,只能申请256M的内存。为什么要申请这么大的空间呢?由于ackerman是嵌套函数,他的值随时用来作为另外一个 函数的下标。因此,要申请足够的空间。不要以为只需要求ackerman(m, n)就for循环到m, n为止,这是错误的。
#include "stdafx.h"
#include <iostream>

using std::cout;
using std::endl;

const int maxN = 8500;

static int akm[maxN][maxN] =...{0};


int Ackerman(int m, int n)

...{
for(int j = 0; j <maxN; j++)
akm[0][j] = j+1;
for(int i = 1; i <maxN; i++)

...{
akm[i][0] = akm[i-1][1];
for(j = 1; j <= maxN; j++)

...{
akm[i][j] = akm[i-1][akm[i][j-1]];
}
}
return akm[m][n];
}
int main(int argc, char* argv[])

...{
cout<<"akm["<<3<<"]"<<"["<<9<<"]"<<" = "<<Ackerman(3, 9)<<endl;
cout<<"akm["<<3<<"]"<<"["<<10<<"]"<<" = "<<Ackerman(3, 10)<<endl;

return 0;
}
/
。
//以下方法被称为“备忘”。
可以,参看《算法导论》这本书的线性规划的后面部分。
同时必须指出:仍然申请的空间要足够的大,原因同上。否则要出错。
这个最多能算到ackerman(3,10) .内存大的应该还可以计算更大的。此种方法较为简单。
#include "stdafx.h"
#include <iostream>
#include "time.h"
const int maxN = 8500;
using std::cout;
using std::endl;

static int Ack[maxN][maxN];
void inint(void )

...{
for(int i = 0; i <maxN; i++)
for(int j = 0; j <maxN; j++)
Ack[i][j] = 0;
}

int Ackerman(int m, int n)

...{
int t = 0;
if(Ack[m][n] != 0)
return Ack[m][n];
if( m ==0 )
return n+1;
if ( n==0 )
t = Ackerman(m-1, 1);

if(m >=1 && n >= 1)...{
Ack[m][n-1] = Ackerman(m, n-1);
t = Ackerman(m-1, Ack[m][n-1]);
}
return (Ack[m][n] = t);
}
int main(int argc, char* argv[])

...{
time_t start, end;
inint();
start = time(0);
for(int i = 0 ; i <= 3; i++)
for(int j = 0; j <= 10; j++)
cout<<"Ack["<<i<<"]"<<"["<<j<<"]"<<" = "<<Ackerman(i, j)<<endl;
end = time(0);
cout<<"using time is "<<difftime(end, start)<<endl;

return 0;
}































注意,申请的内存空间要足够大,反正我的计算机已经提出警告了,只能申请256M的内存。为什么要申请这么大的空间呢?由于ackerman是嵌套函数,他的值随时用来作为另外一个 函数的下标。因此,要申请足够的空间。不要以为只需要求ackerman(m, n)就for循环到m, n为止,这是错误的。
#include "stdafx.h"







































。

可以,参看《算法导论》这本书的线性规划的后面部分。
同时必须指出:仍然申请的空间要足够的大,原因同上。否则要出错。
这个最多能算到ackerman(3,10) .内存大的应该还可以计算更大的。此种方法较为简单。
#include "stdafx.h"




















































