Ackerman函数 的 递归思路

Hello,everybody.我是Aqin!
很高兴能和大家聊聊编程(C++)!
这次的题目如下:

题目描述
计算ackerman函数值:

Ackerman函数 的 递归思路_第1张图片

输入格式
从文件ackerman.in读入数据,第一行为两个数,即M和N,其中0<=M<=3,0<=N<=11。

输出格式
向文件ackerman.out输出ack(m,n)的值。

输入样例
0 1
输出样例
2

初看此题,大家会想到什么?

不用说,当然是 递归 啦!

那么究竟怎么做呢?

代码如下:(详解见代码中)

//开O2才能过,建议使用记忆化 
#include 
using namespace std;

int Ack( int m, int n)//定义Ack函数
{/*递归内容详见图*/
    if(m == 0)//如果m为零
      return  n + 1;//那么返回n+1的值
      else if(n == 0 && m > 0)//如果n=0并且m > 0
        return Ack(m - 1, 1);//那么递归
      else if(m > 0 && n > 0)//如果m,n>0
        return Ack(m - 1, Ack(m, n -1));//那么递归
}
int main()
{
    int m, n;
    cin >> m >> n; //读入
    cout << Ack(m,n);//输出
    return 0;
}

好了,代码就是这样,不过还有一点,你不看直接复制代码会错的:
就是 会超时!!!

但是,不要慌,既然写了这篇文章,我当然有办法(如下)

**使用记忆化搜索!!!**

思路就是
在每一次递归时,记录下当前的值,避免重复计算,然后再在递归前判断是否计算过,若计算过,则直接用。

具体的记录就是开一个数组,初始值全为0,每次先将结果放入,递归前的判断就是如果值不为0,就直接用。

代码我就不写了,防止有些人直接复制,我希望大家都能自己理解,自己动手写!!!

好啦,今天的分享就到这里,我们有机会再见!

你可能感兴趣的:(c++)