青训营笔记 GO递归思想

68 阅读1分钟

递归

递归的思想是把一个大型复杂问题层层转化为一个与原问题规模更小的问题,

问题被拆解成子问题后,递归调用继续进行,直到子问题无需进一步递归就可以解决的地步为止

以下时使用Golang来使用递归实现走迷宫的一个思路

首先通过数组创建一个迷宫

1代表迷宫边界

0代表空

并打印

 package main
 ​
 import "fmt"
 ​
 func main() {
     mapArr := [8][7]int{}
     for i := 0; i < 7; i++ {
         mapArr[0][i] = 1
         mapArr[7][i] = 1
     }
     for i := 0; i < 8; i++ {
         mapArr[i][0] = 1
         mapArr[7][0] = 1
     }
     mapArr[3][1] = 1
     mapArr[3][2] = 1
     mapArr2 := mapArr
     for i := 0; i < 8; i++ {
         for j := 0; j < 7; j++ {
             fmt.Printf(" %d ", mapArr[i][j])
         }
         fmt.Println()
     }

调用并打印

     setWay(&mapArr, 1, 1)
     for i := 0; i < 8; i++ {
         for j := 0; j < 7; j++ {
             fmt.Printf(" %d ", mapArr[i][j])
         }
         fmt.Println()
     }
 }

使用递归回溯来给小球找路 说明

  1. map 表示地图
  2. i,j 表示从地图的哪个位置开始出发 (1,1)
  3. 如果小球能到 map[6][5]位置,则说明通路找到.
  4. 约定: 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通
  5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯
 ​
 func setWay(mapArr *[8][7]int, i int, j int) bool {
     if mapArr[6][5] == 2 {
         return true
     } else {
         if mapArr[i][j] == 0 { //如果当前这个点还没有走过
             mapArr[i][j] = 2 //假定该点是可以走通.
             if setWay(mapArr, i+1, j) {
                 return true
             } else if setWay(mapArr, i, j+1) {
                 return true
             } else if setWay(mapArr, i-1, j) {
                 return true
             } else if setWay(mapArr, i, j-1) {
                 return true
             } else {
                 //说明该点是走不通,是死路
                 mapArr[i][j] = 3
                 return false
             }
 ​
         } else { // 如果map[i][j] != 0 , 可能是 1, 2, 3
             return false
         }
     }
 }