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

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

  • 相关阅读:
    C++中整型变量的存储大小和范围
    A1038 Recover the Smallest Number (30 分)
    A1067 Sort with Swap(0, i) (25 分)
    A1037 Magic Coupon (25 分)
    A1033 To Fill or Not to Fill (25 分)
    A1070 Mooncake (25 分)
    js 获取控件
    C#代码对SQL数据库添加表或者视图
    JS 动态操作表格
    jQuery取得下拉框选择的文本与值
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641699.html
Copyright © 2011-2022 走看看