关于AckerMan函数

递归方法最简单,不需要说明。

 
#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==0return 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(39)<<endl;
             cout
<<"akm["<<3<<"]"<<"["<<10<<"]"<<" = "<<Ackerman(310)<<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-11);
    
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;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yshuise

权术横行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值