遞歸(recursion)
-
基本介紹
程序調用自身的編程技巧稱為遞歸。遞歸算法相對於常用的算法如普通算法等,運行效率較低。在遞歸調用的過程中系統為每一層的返回點、局部量等開闢了棧儲存。遞歸次數過多容易造成棧溢出。
-
應用場景
- 8皇后問題
- 漢諾塔
- 階乘
- 迷宮
- 球和籃子
- 用棧解決的一些問題
-
注意:函數的局部變量是獨立的,不會相互影響,如果希望各個函數棧使用同一個數據,使用引用傳遞。
-
代碼實例
//迷宮問題 //如果二維數組中的元素為1,就是墻 //0即沒有走過,2是通路,3是走過的點(不通) //最短路徑待完成 func SetWay(myMap *[8][7]int,i,j int) bool { //[6][5]下標對應第七行第6列,定義為出口 if myMap[6][5] == 2 { return true }else { //如果沒有走過 if myMap[i][j] == 0 { //將其設置為能夠走的通路 myMap[i][j] = 2 if SetWay(myMap,i+1,j){//下 return true }else if SetWay(myMap,i,j+1){//右 return true }else if SetWay(myMap,i-1,j){//左 return true }else if SetWay(myMap,j,j-1){//上 return true }else { //如果走回來了,說明只有一條死路 myMap[i][j] = 3 return false } }else {//數值是1,為墻 return false } } } func main() { //迷宮大小 var myMap[8][7]int //上下左右四周是墻 for i:=0;i<7;i++{ myMap[0][i] = 1 myMap[7][i] = 1 } for i := 0; i < 8; i++ { myMap[i][0] = 1 myMap[i][6] = 1 } //設置的額外的墻 myMap[3][1] = 1 myMap[3][2] = 1 //迷宮地圖 for i := 0;i<8;i++ { for j := 0; j < 7; j++ { fmt.Print(myMap[i][j],"") } fmt.Println() } //開始遞歸搜索 SetWay(&myMap,1,1) fmt.Println("探測完畢") for i := 0; i < 8; i++ { for j := 0; j < 7; j++ { fmt.Print(myMap[i][j],"") } fmt.Println() } }