遞迴,迭代和遍歷
遞迴
如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。
條件:必須要有收斂條件和遞迴公式。
特性:1.必須有一個明確的結束條件。
2.每次進入更深一層遞迴時,問題規模相比賞析遞迴都應有所減少。
3.遞迴效率不高,遞迴層次過多會導致棧溢位(遞迴最大999層)。
一切用遞迴實現的功能都可以用迴圈實現,但有些時候遞迴函式更易讀
def calc(n):
print(n)
if int(n/2)>0: #收斂條件
return calc(int(n/2)) #遞迴公式
calc(10)
遞迴的基本概念:程式呼叫自身的程式設計技巧稱為遞迴,是函式自己呼叫自己。一個函式再其定義中直接或間接呼叫自身的一種方法,他通常把一個大型的複雜的問題轉化為一個與原問題相似的規模較小的問題來解決,可以極大的減少程式碼量。遞迴的能力在於用有限的語句來定義物件的無限集合。
迭代
重複執行一段程式碼語句塊的能力。目的通常是為了逼近所需目標或結果。每次對過程的重複稱為一次'迭代'(迴圈),迭代會根據上次迴圈的結果調整本次結果。而每一次迭代得到的結果會作為下一次迭代的初始值。
遞迴和迴圈都可以實現迭代,但都要重複執行一段程式碼語句,就是迭代。
遞迴函式實現
def count(n):
if n >0:
print(n)
count(n-1)
else:
print('over!') count(10) >>>3 >>>2 >>>1 >>>over!
定義一個函式conut,每列印一個數字,這個函式就會重複執行一次,也就是迭代一次。
迴圈實現(for迴圈和while迴圈)
for i in range(10,0,-1):
print(i)
n = 10
while n>0:
print(n)
n-=1
迭代利用變數的原值推算出限量的一個新值,如果遞迴是自己呼叫自己的話,迭代就是A不停的呼叫B。不論是for還是while,執行流程都會執行玩語句體,之後再從語句體的最開頭迴圈執行,,每執行一次也稱為迭代一次。
總結:
遞迴中一定有迭代 ,但是迭代中不一定有遞迴,大部分可以相互轉換,能用迭代的不用遞迴,遞迴呼叫函式,浪費空間,並且遞迴容易造成棧的溢位。
遍歷
所謂遍歷,是指沿著某條搜尋路線,依次對資料中的每個物件做一次且僅做一次執行動作。
list = ['a','b','c']
for i in list:
print(i)
從實現程式碼可以用看出,這次遍歷時候通過for迴圈來實現的,與也就是迭代來實現的。
當然也可以不通過迭代來實現,一個以一個按照下標打印出來,也能遍歷,不過效率太低。
總結:遍歷是目的,迭代是手段。