1 package cn.htu.test;
2 /**
3 * 这里的ackerman(n,m)就是题目当中的A(n,m)
4 * 这里的比较关键的思想就是当m=1时,A(1,1)=2,A(n,1)=A(n-1,1)+2
5 * 所以当m=1的时候A(n,1)是函数"乘2"
6 * 当m=2也可以对导出来,当m=3也可以推导出来,但是以及是数学表达式的极限了,幂上幂上幂......
7 * 详细的看一下上面的题目分析吧,当m=4的时候增长的太快以至于实验的时候stack溢出
8 *
9 */
10 import java.util.Scanner;
11 public class Ackerman
12 {
13 public static void main(String args[]){
14 try
15 {
16 System.out.println("n:");
17 Scanner scanner=new Scanner(System.in);
18 int n=scanner.nextInt();
19 System.out.println("m:");
20 int m=scanner.nextInt();
21 System.out.println(ackerman(n,m));//执行A函数,并返回函数结果
22 }
23 catch (Exception e)
24 {
25 }
26 }
27
28
29 //照着表达式敲就对了,所以递归和分治的算法核心就是要找到表达式
30 public static int ackerman(int n,int m){
31 if (n==1&&m==0)
32 {
33 return 2;
34 }else if (n==0&&m>=0)//这里要注意后面的表达式的取值范围也是在代码里和式子有着等价值的地位,要放在一块
35 {
36 return 1;
37 }else if (n>=2&&m==0)
38 {
39 return n+2;
40 }else {
41 return Ackerman.ackerman(Ackerman.ackerman(n-1,m),m-1);
42 }
43 }
44 }