算法老师给我们布置的两道题拖了几天了,今天决定搞定它们。
其中有一道就是:
计算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 这个,我估计得算相当久,也不知道用什么类型来存结果最适合,放弃……
一句感叹:它膨胀得太快了,是我有眼不识泰山!