并非一切的递归函数都能用非递归方式定义。
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
*/