目錄
今天我們來學習python中最為重要的內容之遞迴,對以往內容感興趣的同學可以檢視下面:
python資料型別: python資料結構:資料型別.
python的輸入輸出: python資料結構之輸入輸出、控制和異常.
python物件導向: python資料結構之物件導向.
python演算法分析: python資料結構演算法分析.
python資料結構之棧、佇列和雙端佇列
遞迴是在進行重複性工作中經常考到的問題,非常值得學習。
遞迴是解決問題的一種方法,它將問題不斷地分成更小的子問題,直到子問題可以用普通的方法解決。通常情況下,遞迴會使用乙個不停呼叫自己的函式。儘管表面上看起來很普通,但是遞迴可以幫助我們寫出非常優雅的解決方案。對於某些問題,如果不用遞迴,就很難解決。
上面的話很難理解,我們用乙個例子來說明:我們需要求解乙個陣列的所有數值之和。
#用for迴圈的簡單函式
def getsum(numlist):
a=0for i in numlist:
a=i+a
return a
結果如下:
如果暫時沒有while迴圈和 for 迴圈。應該如何計算結果呢? 這個時候就需要想到我們計算加法的時候,是接受2個引數的函式,根據這個思想,我們將求一列數之和重新定義成求數字對之和。
注:最內層的括號對(7 + 9)不用 迴圈或者其他特殊語法結構就能直接求解。
擬**表示
#first(list)返回列表中的第乙個元素,rest(list)則返回其餘元素。用 python 可以輕鬆地實現這個等式,
getsum(list)=first(list)+getsum(rest(list))
**表示:
#這是乙個遞迴小案例,這個函式在函式內部自己呼叫了自listsum(numlist[1:])
def listsum(numlist):
if len(numlist)==1:#當陣列的長度為1時,代表是陣列是乙個數了
return numlist[0]
else:
return numlis程式設計客棧t[0] + listsum(numlist[1:])#第乙個數加上後面的數,這裡自己呼叫了自己,是陣列不斷遞迴的條件
在這一段**中,有兩個重要的思想值得**。首先,第 2 行檢查列表是否只包含乙個元素。 這個檢查非常重要,同時也是該函式的退出語句。對於長度為 1 的列表,其元素之和就是列表中的數。其次,listsum 函式在第 5 行呼叫了自己!這就是我們將list程式設計客棧sum稱為遞迴函式的原因——遞迴函式會呼叫自己。
演示一下相加過程
遞迴演算法有三個重要的原則:
讓我們看看我們第乙個案例是怎麼實現這個部分的:
遞迴的邏輯並不是迴圈,而是將問題分解成更小、更容易解決的子問題。
下面展示一下將10進製的29轉換為2進製數的方法,按照這個方法,可以將10進製轉化為任意進製的數。
這裡我們用遞迴來實現2~16進製制數的轉換
#n代表要轉化的10進製數,base代表你要實現的多少進製的數
def tostr(n, base):
convertstring = "0123456789abcdef"#取對應位置的字元
if n < base:#如果10進製數小於你所轉換的進製數字數,則直接選擇字元
return convertstring[n]
else:#遞迴核心,n//base獲取結果,然後進行遞迴
return tos程式設計客棧tr(n//base, base) + convertstring[n%base]
將15轉化為16進製制數
將15轉化為2進製數
Python資料結構之 遞迴 1
遞迴 解決問題的方法,將問題分解為規模更小的問題,直到可以用非常簡單直接的方式就可以解決。最簡單的例子,給定乙個列表,返回所有數的和,如不考慮迴圈語句,即可使用遞迴來實現。意識到數列求和實際上是乙個乙個加法實現的。如何把規模比較大的問題變成小規模的問題來解決。求和問題可以歸納為 listsum nu...
資料結構之遞迴
本篇是資料結構與演算法之美學習筆記 遞迴在電腦科學中指一種通過將重複問題分解為同列子問題來解決問題的方法。遞迴是一種常見的演算法或者程式設計技巧。很多資料結構和演算法的編碼實現都會使用到遞迴,比附dfs深度搜尋,前中後序二叉樹遍歷等等。遞迴需要滿足三個條件 1.乙個問題的解可以分成幾個解。子問題就是...
資料結構之遞迴
資料結構與演算法遞迴 class solution def factorial self,n if n 1 return 1else return n factorial n 1 如果查詢的資料是有序的,二分查詢演算法比順序查詢演算法更高效 defbinary search nums,v nums....