其他分享
首页 > 其他分享> > Ackermann函数的非递归求值

Ackermann函数的非递归求值

作者:互联网

Ackermann函数的非递归求值

描述

Ackermann函数定义见题解,题目要求使用递归实现这个函数。

输入

多组数据,每组数据有一行,为两个整数m和n。当m和n都等于0时,输入结束。

输出

每组数据输出一行,为Ack(m,n)。

输入样例 1
2 1
0 0
输出样例 1
5
AC 代码
/*bjfu什么破网,根本加载不出Ackermann函数的定义
Ackermann函数定义:

若m=0,返回n+1。
若m>0且n=0,返回Ackermann(m-1,1)。
若m>0且n>0,返回Ackermann(m-1,Ackermann(m,n-1))

纯纯的递归形式,虽然它的介绍上是阿克曼函数(Ackermann)是非原始递归函数的例子

因此这题需要你使用非递归的方式来实现Ackermann函数

警告:一旦 m > 3,连 long long 也hold不住
*/

/*基本思路:
我们使用栈的特性来实现(bushi),栈的水太深了,还是用二维数组吧
其实数组水也深
基本思路就是用二维数组模拟树,第一维代表层数(也不知道理解得对不对)
*/

#include <iostream>

#define MAX 100

using namespace std;

int Ackermann(int m, int n)
{
    int tmp[m + 1][MAX];
    for (int j = 0; j < MAX; j ++)
        tmp[0][j] = j + 1;
    for (int i = 1; i <= m; i ++)
    {
        tmp[i][0] = tmp[i - 1][1];
        for (int j = 1; j < MAX; j ++)
            tmp[i][j] = tmp[i - 1][tmp[i][j - 1]];
    }
    
    return (tmp[m][n]);
}

int main()
{
    int m, n;
    while (cin >> m >> n, m && n)
        cout << Ackermann(m, n) << endl;
    
    return 0;
}

标签:tmp,Ackermann,函数,递归,int,MAX,求值
来源: https://blog.csdn.net/weixin_57095511/article/details/121311804