ACM Ackermann function(阿克曼函数)

C/C++ || ACM 专栏收录该内容
17 篇文章 0 订阅

           这个问题真没想到,没留意M最大只有3,也完全没有想到用公式啥的,当时没往这方面想,直接按递归公式写的算法,结果狠狠的巴掌:超时了。。。。


问题描述
众所周知,阿克曼函数中扮演一个重要的角色在理论计算机科学领域。 然而,在另一方面,戏剧性的快速增长速度引起的功能很难calcuate阿克曼的价值功能。

阿克曼函数可以递归地定义如下:


现在艾迪给你两个数字:m和n,你的任务是计算的价值(m,n)。这是如此简单的问题,如果你解决这个问题,你将收到一个奖(艾迪将邀请你,6餐厅吃晚饭)。

输入
的每一行输入两个整数,即m,n,0 < m < = 3。
注意,当m < 3,n可以是任意整数不到1000000,而m = 3,n的值限制在24。
输入终止结束的文件。

输出
为每个值m,n,打印出的价值(m,n)。

样例输入
  
1 3 2 4

样例输出
  
5 11
下面是超时的代码:

int fun(int m, int n)
{
    if(m==0)
    return n+1;
    if(m>0 && n == 0)
    {
        fun(m-1,1);
    }
    if (m>0 && n>0)
    {
    	fun(m-1,fun(m,n-1));
    	if (m==3)
    	{
    		if(n>24)
    		n=24;
    	}
    }
}


M最大是3 所以可以直接把m=1,2,3
的公式推出来,推导m=1时要结合m=0时推
推导m=2时用m=1时 同理可得到
m=0    n+1;
m=1    n+2;
m=2   2*n+3
m=3   dp[3][i]=2*dp[3][i-1]+3;


#include<stdio.h>
long int A(long int,long int);
main()
{
	long int n,m;
	while(scanf("%ld%ld",&m,&n)!=EOF)
		printf("%ld\n",A(m,n));
}
long int A(long int m,long int n)
{
	if(n==0) return A(m-1,1);
	else if(m==0)return n+2;
	else if(m==1) return n+2;
	else if(m==2) return 2*n+3;
	else  if(m==3)return A(m,n-1)*2+3;<pre name="code" class="cpp">       //else if(m==3) return (1<<n+3)-3;
}

 


  • 0
    点赞
  • 2
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值