• 强大的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    这个,我估计得算相当久,也不知道用什么类型来存结果最适合,放弃……

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

  • 相关阅读:
    Luogu P1596 [USACO10OCT]湖计数Lake Counting
    Luogu P1757 通天之分组背包
    数据建模笔记1
    单纯形算法 matlab
    有效集 matlab代码
    拟牛顿 DFP matlab
    FR共轭梯度法 matlab
    整数规划
    线性规划 Matlab
    远期、期货和互换(三)
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641699.html
Copyright © 2020-2023  润新知