强大的ackermann函数

    算法老师给我们布置的两道题拖了几天了,今天决定搞定它们。

    其中有一道就是:

    计算ackermann函数ack(m,n)的递归计算函数。 对于m>=0,n>=0,ack(m,n)定义为:

    ack(0,n)=n+1;

    ack(m,0)=ack(m-1,1);

    ack(m,n)=ack(m-1,ack(m,n-1))

    对着题目看了半天,都不明白这个递归究竟是什么意思,也没在意,就写了程序直接执行:

#include<iostream>
using namespace std;

unsigned int ack(unsigned int m,unsigned int n)
{
if(m==0) return n+1;
else if(n==0) return ack(m-1,1);
else return ack(m-1,ack(m,n-1));
}

int main()
{
unsigned int m,n;
cin>>m>>n;
cout<<ack(m,n)<<endl;
}

   随手输入了几组m,n居然发现有很多次电脑都比较长时间没反应。按说我写的递归没什么问题啊,于是就谷歌了下ackermann,结果……目瞪口呆,心服口服。原来这是历史上一个著名的递归函数!具体的资料大家可以到http://en.wikipedia.org/wiki/Ackermann_function去看,懒得看英文的看那几个表格就行了!

    令我吃惊的数据:

    ack(4,1)=65533(我的电脑算了100秒左右才出结果,期间CPU占用100%,朋友的更猛,直接内存飙满被迫退出程序,看网上的评论一般都得算个几分钟才行)

    ack(4,2)=2的65536次方-3    这个,我估计得算相当久,也不知道用什么类型来存结果最适合,放弃……

    一句感叹:它膨胀得太快了,是我有眼不识泰山!

posted @ 2008-10-14 06:29  mzlogin  阅读(2945)  评论(0编辑  收藏  举报