Python基於遞歸演算法實現的走迷宮問題
本文實例講述了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)
遞歸是個好東西呀!
2. 使用函數嵌套調用和遞歸函數編寫代碼(1!)平方+(2!)平方只和Python
摘要 函數的本質就是一段有特定功能、可以重復使用的代碼。
3. python後端開發需要學什麼
第一階段:Python語言基礎
主要學習Python最基礎知識,如Python3、數據類型、字元串、函數、類、文件操作等。階段課程結束後,學員需要完成Pygame實戰飛機大戰、2048等項目。
第二階段:Python語言高級
主要學習Python庫、正則表達式、進程線程、爬蟲、遍歷以及MySQL資料庫。
第三階段:Pythonweb開發
主要學習HTML、CSS、JavaScript、jQuery等前端知識,掌握python三大後端框架(Django、 Flask以及Tornado)。需要完成網頁界面設計實戰;能獨立開發網站。
第四階段:Linux基礎
主要學習Linux相關的各種命令,如文件處理命令、壓縮解壓命令、許可權管理以及Linux Shell開發等。
第五階段:Linux運維自動化開發
主要學習Python開發Linux運維、Linux運維報警工具開發、Linux運維報警安全審計開發、Linux業務質量報表工具開發、Kali安全檢測工具檢測以及Kali 密碼破解實戰。
第六階段:Python爬蟲
主要學習python爬蟲技術,掌握多線程爬蟲技術,分布式爬蟲技術。
第七階段:Python數據分析和大數據
主要學習numpy數據處理、pandas數據分析、matplotlib數據可視化、scipy數據統計分析以及python 金融數據分析;Hadoop HDFS、python Hadoop MapRece、python Spark core、python Spark SQL以及python Spark MLlib。
第八階段:Python機器學習
主要學習KNN演算法、線性回歸、邏輯斯蒂回歸演算法、決策樹演算法、樸素貝葉斯演算法、支持向量機以及聚類k-means演算法。
關於python後端開發需要學什麼的內容,青藤小編就和您分享到這里了。如果您對python編程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關於python編程的技巧及素材等內容,可以點擊本站的其他文章進行學習。
4. python怎麼用遞歸的方法判斷一個數是不是在嵌套循環里,如search([1,[2,3],4,[
defsearch(arr,v,):
ifnotarr:
returnFalse
item,rest=arr[0],arr[1:]
ifisinstance(item,(list,tuple)):
returnTrueifsearch(item,v)elsesearch(rest,v)
returnTrueifitem==velsesearch(rest,v)
if__name__=='__main__':
arr=[1,[2,3],4,[5,[6,[],[8,9],10]]]
test_v=[100,1,5,6,20,100]
forvintest_v:
print(v,search(arr,v))
5. 函數的嵌套調用和遞歸調用有什麼區別
函數的遞歸調用本身就是函數的嵌套調用
只不過當被調用的函數是自身(或間接自身,比如a調用b,b又調用a)
那麼就是遞歸調用
6. python遞歸演算法經典實例有哪些
程序調用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種演算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法。
它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。
遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
Python
是完全面向對象的語言。函數、模塊、數字、字元串都是對象。並且完全支持繼承、重載、派生、多繼承,有益於增強源代碼的復用性。Python支持重載運算符和動態類型。相對於Lisp這種傳統的函數式編程語言,Python對函數式設計只提供了有限的支持。有兩個標准庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
7. 函數嵌套是指 ,遞歸是指 。
函數嵌套。。一般提到這個有兩個意思,有的語言運行函數嵌套那就是函數的嵌套,指在一個函數體里定義另一個函數,比如python
def outer():
name="python"
def inner():
print name
return inner()
有的語言不允許函數嵌套,那指的就是函數嵌套調用。比如c語言的
int a()
{
b();//調用函數b
}
遞歸的話就是自己調用自己
int a(int x){
if(x==5)return 0; //一定要有結束條件不然遞歸就爆內存的
x++;
a(x);
}
調用函數
a(0); //那麼遞歸過程是a(0)--->a(1)--->a(2)--->a(3)--->a(4)--->a(5)
8. python3 如何解析多層嵌套字典,具體內容打開看
# 見 代碼 ,代碼粘貼上不帶格式,按照圖片用tab鍵調整一下,圖片是核心部分
simple_dict={
'Large_dict':{'middle_dict1':{'small_dict1':1,
'small_dict2':2},
'middle_dict2':{'small_dict3':3,
'small_dict4':4,
'small_dict5':{'small_dict10':1,
'small_dict22':3},
},
}
}
#需求分析:從嵌套字典中,找到值為3的路徑關系
#簡化模型:從value為3的值遞歸向上層的key,遞歸過程保存當前已經遞歸的路徑和當前層
#1.找到字典一共有多少層:
count=0
path=''#設置路徑的全局變數
result=[]#記錄結論
defget_count(dict_test):
globalcount#聲明每次遞歸均是改變全局變數
globalpath#拼接檔期啊你的路徑
globalresult#記錄結果
foriindict_test:
iftype(dict_test[i]).__name__=='dict':
#如果是字典,則繼續向下展開,即執行遞歸:
ifcount==0:#增加判斷消除第一個<-出現,邏輯問題
path=path+i
else:
path=path+'<-'+i
count+=1#記錄層數
get_count(dict_test[i])
else:
try:
#如果不是字典則是鍵值對,查詢value值是不是3,當前i包含兩個內容,一個是key,一個是value
ifdict_test[i]==3:
#找到了value=3的值
result.append(f"路徑是:%s,在第%d層"%(path+'<-'+i,count))
exceptExceptionasresult:#雖然字典限定了寫法,為了增加健壯性此位置使用try指令,避免類型錯誤
print(result)
continue
if__name__=='__main__':
get_count(simple_dict)#執行遞歸函數
[print(str(i+1)+':'+j)fori,jinenumerate(result)]#列印結果
'''
結果:
1:路徑是:Large_dict<-middle_dict1<-middle_dict2<-small_dict3,在第3層
2:路徑是:Large_dict<-middle_dict1<-middle_dict2<-small_dict5<-small_dict22,在第4層
'''