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

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

  • 相关阅读:
    Linq查询
    Lambda表达式与标准运算符查询
    第四章 面向对象与IO操作
    第三章 C#循环与方法
    第二章 C#基本数据类型
    FPGA与嵌入式一点见解
    FPGA中RAM使用探索
    可控硅的工作原理和主要作用
    异步电路中时钟同步的方法
    FPGA中计数器设计探索
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641699.html
Copyright © 2011-2022 走看看