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

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

  • 相关阅读:
    linux查看安装文件
    mysql 查询表结构
    linux回退到上次访问目录
    正则表达式匹配所有字符包括换行符
    Spring配置文件中使用表达式
    Ext 修改Store初始化加载完后修改record属性。
    数据库锁
    C#中的多线程使用 -- Thread 类详解(转)
    div背景等比例缩小
    div添加透明边框透明背景css
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641699.html
Copyright © 2011-2022 走看看