【数据结构与算法 8】递归之迷宫问题
生活随笔
收集整理的這篇文章主要介紹了
【数据结构与算法 8】递归之迷宫问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、簡介
遞歸就是方法自己調用自己,每次調用時傳入不同的參數,遞歸有利于編程者解決復雜的問題,同時可以讓代碼變得簡潔。
二、用一個例子引出遞歸概念
public static void test(int n){if(n>2){test(n-1);}System.out.println("n="+n); }打眼一看,很low,很簡單,4,3,2無疑。
為了驗證我的聰明才智,輸出一把吧
三、遞歸調用規則(很重要)
1、執行一個方法時,就創建一個新的受保護的獨立空間(棧空間);
2、方法的局部變量是獨立的,不會相互影響,比如變量n;
3、如果方法中使用的是引用類型變量(比如數組),就會共享該引用類型的數據;
4、遞歸必須向退出遞歸的條件逼近,否則就是無限遞歸,StackOverflowError;
5、當一個方法執行完畢,或遇到return,就會返回,遵守誰調用就將結果返回給誰,同時當方法執行完畢或return時,該方法也就執行完畢。
四、遞歸能解決什么樣的問題
1、各種數學問題
比如八皇后問題、哈諾塔、階乘問題、迷宮問題、球和籃子的問題(Google編程大賽)。
2、各種算法中也會使用遞歸
比如快排、歸并排序、二分查找、分治算法。
3、棧解決的問題都可以用遞歸
代碼更加簡潔。
五、迷宮問題
1、代碼實現
package dataStructure.recursion;public class Labyrinth {public static void main(String[] args) {//迷宮問題//0 表示該點沒有走過 當為 1 表示墻 ; 2 表示通路可以走 ; 3 表示該點已經走過,但是走不通int[][] map = new int[8][7];for(int i=0;i<8;i++){for (int j = 0; j < 7; j++) {map[0][j] = 1;map[7][j] = 1;map[i][0] = 1;map[i][6] = 1;}}//設置擋板, 1 表示map[3][1] = 1;map[3][2] = 1;for (int i = 0; i < 8; i++) {for (int j = 0; j < 7; j++) {System.out.print(map[i][j]+" ");}System.out.println();}setWay(map,1,1);System.out.println("迷宮走過之后地圖");for (int i = 0; i < 8; i++) {for (int j = 0; j < 7; j++) {System.out.print(map[i][j]+" ");}System.out.println();}}//使用遞歸回溯來給小球找路//說明//1. map 表示地圖//2. i,j 表示從地圖的哪個位置開始出發 (1,1)//3. 如果小球能到 map[6][5] 位置,則說明通路找到.//4. 約定: 當map[i][j] 為 0 表示該點沒有走過 當為 1 表示墻 ; 2 表示通路可以走 ; 3 表示該點已經走過,但是走不通//5. 在走迷宮時,需要確定一個策略(方法) 下->右->上->左 , 如果該點走不通,再回溯private static boolean setWay(int[][] map,int i,int j){if(map[6][5] == 2){return true;}else{if(map[i][j]==0){map[i][j] = 2;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;return false;}}else {return false;}}} }2、控制臺輸出
注:1表示墻,2表示你走的路,0表示沒走的路。
這個還是挺簡單的!
?
每一篇博客都是一種經歷,程序猿生涯的痕跡,知識改變命運,命運要由自己掌控,愿你游歷半生,歸來仍是少年。
欲速則不達,欲達則欲速!
總結
以上是生活随笔為你收集整理的【数据结构与算法 8】递归之迷宫问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【调剂】211北京邮电大学2020年软件
- 下一篇: 软件构造参考资料