算法:Python遞歸實現走迷宮

  • 什麼是遞歸?

    簡單地理解就是函數調用自身的過程就稱之爲遞歸

  • 什麼時候用到遞歸?

    如果一個問題可以表示爲更小規模的迭代運算,就可以使用遞歸算法。


迷宮問題:一個由0或1構成的二維數組中,假設1是可以移動到的點,0是不能移動到的點,如何從數組中間一個值爲1的點出發,每一隻能朝上下左右四個方向移動一個單位,當移動到二維數組的邊緣,即可得到問題的解,類似的問題都可以稱爲迷宮問題。
在python中可以使用list嵌套表示二維數組。假設一個6*6的迷宮,問題時從該數組座標[3][3]出發,判斷能不能成功的走出迷宮。

maze=[[1,0,0,1,0,1],
      [1,1,1,0,1,0],
      [0,0,1,0,1,0],
      [0,1,1,1,0,0],
      [0,0,0,1,0,0],
      [1,0,0,0,0,0]]

針對這個迷宮問題,我們可以使用遞歸的思想很好的解決。對於數組中的一個點,該點的四個方向可以通過橫縱座標的加減輕鬆的表示,每當移動的一個可移動的點時候,整個問題又變爲和初始狀態一樣的問題,繼續搜索四個方向找可以移動的點,知道移動到數組的邊緣。
所以我們可以這樣編碼:

# 判斷座標的有效性,如果超出數組邊界或是不滿足值爲1的條件,說明該點無效返回False,否則返回True。
def valid(maze,x,y):
    if (x>=0 and x<len(maze) and y>=0 and y<len(maze[0]) and maze[x][y]==1):
        return True
    else:
        return False
# 移步函數實現
def walk(maze,x,y):
    # 如果位置是迷宮的出口,說明成功走出迷宮
    if(x==0 and y==0):
        print("successful!")
        return True
    # 遞歸主體實現
    if valid(maze,x,y):
        # print(x,y)
        maze[x][y]=2  # 做標記,防止折回
        # 針對四個方向依次試探,如果失敗,撤銷一步
        if not walk(maze,x-1,y):
            maze[x][y]=1
        elif not walk(maze,x,y-1):
            maze[x][y]=1
        elif not walk(maze,x+1,y):
            maze[x][y]=1
        elif not walk(maze,x,y+1):
            maze[x][y]=1
        else:
            return False  # 無路可走說明,沒有解 
    return True

walk(maze,3,3)

遞歸是個好東西呀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章