本文實(shí)例講述了Python基于遞歸算法實(shí)現(xiàn)的走迷宮問題。分享給大家供大家參考,具體如下:
什么是遞歸?
簡單地理解就是函數(shù)調(diào)用自身的過程就稱之為遞歸。
什么時候用到遞歸?
如果一個問題可以表示為更小規(guī)模的迭代運(yùn)算,就可以使用遞歸算法。
迷宮問題:一個由0或1構(gòu)成的二維數(shù)組中,假設(shè)1是可以移動到的點(diǎn),0是不能移動到的點(diǎn),如何從數(shù)組中間一個值為1的點(diǎn)出發(fā),每一只能朝上下左右四個方向移動一個單位,當(dāng)移動到二維數(shù)組的邊緣,即可得到問題的解,類似的問題都可以稱為迷宮問題。
在python中可以使用list嵌套表示二維數(shù)組。假設(shè)一個6*6的迷宮,問題時從該數(shù)組坐標(biāo)[3][3]出發(fā),判斷能不能成功的走出迷宮。
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]]
針對這個迷宮問題,我們可以使用遞歸的思想很好的解決。對于數(shù)組中的一個點(diǎn),該點(diǎn)的四個方向可以通過橫縱坐標(biāo)的加減輕松的表示,每當(dāng)移動的一個可移動的點(diǎn)時候,整個問題又變?yōu)楹统跏紶顟B(tài)一樣的問題,繼續(xù)搜索四個方向找可以移動的點(diǎn),知道移動到數(shù)組的邊緣。
所以我們可以這樣編碼:
# 判斷坐標(biāo)的有效性,如果超出數(shù)組邊界或是不滿足值為1的條件,說明該點(diǎn)無效返回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# 移步函數(shù)實(shí)現(xiàn)def walk(maze,x,y): # 如果位置是迷宮的出口,說明成功走出迷宮 if(x==0 and y==0): print("successful!") return True # 遞歸主體實(shí)現(xiàn) if valid(maze,x,y): # print(x,y) maze[x][y]=2 # 做標(biāo)記,防止折回 # 針對四個方向依次試探,如果失敗,撤銷一步 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 Truewalk(maze,3,3)遞歸是個好東西呀!
希望本文所述對大家Python程序設(shè)計有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選