1、遞歸概念
- 自己調用自己
- 每次調用傳入的變量都不同
2、遞歸怎么調用的
3、遞歸應該遵守的規則
- 執行一個方法時,就創建一個新的受保護的獨立空間(棧空間)
- 方法的局部變量是獨立的,不會相互影響,比如n變量
- 遞歸必須有退出的條件,否則就是無限遞歸,報stackOverFloweError(棧溢出錯誤)
- 當一個萬法執行完畢,或者遇到returm,就會返回,守誰調用,就將結果返回給誰
- 如果萬法中使用的是引用類型變量(比如數組),就會共享該引用類型的數據
4、迷宮問題解決
先用二維數組模擬出表格,給部分表格賦值1來說明是牆壁(紅色部分)
public static void main(String[] args) { int[][] map=new int[10][10]; //設置牆體 for (int i=0;i<10;i++){ map[0][i]=1; map[i][0]=1; map[i][9]=1; map[9][i]=1; } //設置障礙 map[3][1]=1; map[3][2]=1; //map[1][2]=1; //map[2][2]=1; //打印表格 for (int i=0;i<10;i++){ for (int j=0;j<10;j++){ System.out.print(map[i][j]+" "); } System.out.println(); } //進行尋路 setWay(map,1,1); //打印表格 System.out.println("尋路完成"); for (int i=0;i<10;i++){ for (int j=0;j<10;j++){ System.out.print(map[i][j]+" "); } System.out.println(); } }
設置尋路的方法,按照設置的策略(如下右上左)來逐個進行遞歸,如果能走通,這條路線標識為2,走不通(無法到達指定終點)遞歸進行回溯,將走過的路置為3
判斷這條路是否可行: 1是牆,2是走過的路,3是走不通的路
//設置策略方法(下右上左) public static boolean setWay(int[][] map,int i,int j){ //map表示數組地圖,i,j表示坐標 if (map[8][8]==2){//開始前判斷該節點是否找到 return true; }else{ if (map[i][j]==0){ map[i][j]=2; //走過的地方都先置為2,回溯后置為3 if (setWay(map,i+1,j)){ //下 return true; }else if (setWay(map,i,j+1)){ //右 return true; }else if (setWay(map,i-1,j)){ //上 return true; }else if (setWay(map,i,j-1)){ //左 return true; }else{ map[i][j]=3; //查找失敗時,這個路線回溯並設置為3 return false; } }else{ return false; } }
運行結果是:
注意:選擇的策略不同,迷宮的查找路徑就不同
如何獲取最短路徑?
可以統計不同的策略生成的路線,通過獲取策略的路徑長度來比較出最短路徑的策略
如上面這種策略,統計路徑長度
//統計路長 int count=0;//長度 for (int i=0;i<10;i++){ for (int j=0;j<10;j++){ if (map[i][j]==2){ //當路徑標識為2時為可用 count+=1; } } } System.out.println("路徑長"+count);