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 }