递归之Ackerman函数

并非一切的递归函数都能用非递归方式定义。

Ackerman函数是一个双递归函数,当一个函数以及它的一个变量是由函数自身定义时,称为双递归函数。

Ackerman是一个双递归函数A(N,M)

函数定义如下:A(1,0)=2;
A(0,m)=1; m>=0
A(n,0)=n+2; n>=2
A(n,m)=A(A(n-1,m),m-1); n,m>=1
推理可得:A(n,0)定义了函数加2;A(n,1)=2n定义了函数乘2;A(n,2)=2^n;

Acherman的增长速度非常快,所以常用其特殊情况:
定义单变量的Ackerman函数为A(n)=A(n,n),其逆函数α(n)是使n<=A(k)成立的最小k值;增长速度非常慢。

接下来我们用代码实现Ackerman函数,通过其函数定义就看出是递归:

import java.util.*;
public class Ackerman {
	public static void main(String[] args){
		Scanner in = new Scanner(System.in);
		int N1 = in.nextInt();
		int N2 = in.nextInt();
		System.out.println(ackerman(N1,N2));
	}
	private static int ackerman(int n,int m){
		int F;
		if(n==1 && m==0)
			F = 2;
		else if(n==0 && m>=0)
			F = 1;
		else if(n>=2 && m==0)
			F = n+2;
		else
			F = ackerman(ackerman(n-1,m),m-1);
		return F;
	}
}
/*
10 2
1024
 */


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值