遞迴
在函式內部,呼叫函式自身的程式設計技巧稱為遞迴( recursion)。遞迴函式結構清晰,很直觀的理解計算過程,但也有嚴重缺點:相對於普通迴圈而言,遞迴執行效率較低,經過很多冗餘的計算,遞迴會消耗大量的呼叫堆疊。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀。每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,遞迴呼叫的次數過多,會導致棧溢位。因此,應該盡量用迴圈代替遞迴。
舉個階乘的例子,用函式 ca(n) 表示階乘,ca(n) = n! = 1 * 2 * 3 * 4 * (n-1 ) * n = n * ca(n-1)
defca(n):
if n == 1:
return 1
return n*ca(n-1)
函式的計算過程是這樣的:
(ca(5))(4 * ca(5))
(3 * (4 * ca(5)))
(2 * (3 * (4 * ca(5))))
(1 * (2 * (3 * (4 * (5)))))
迭代
利用 for 迴圈來遍歷乙個列表(list)或元組(tuple),將值依次取出,這種方法我們稱為迭代。
for x in range(10):print x
我們可以用 for 迴圈類計算階乘:
m = 1for x in range(1,10):
m *=x
m>>> 3628800
可以用函式來更加人性化階乘:
deffactorial(x,y):
m =0
if x >0:
for n in (x,y+1):
m *=n
return
mprint factorial(1,10)
python還提供乙個 reduce 函式,利用 lambda 匿名函式,一行**便可以完成階乘的計算:
print reduce(lambda x,y: x*y, range(1,11))
Python遞迴和迭代
遞迴 在函式內部,呼叫函式自身的程式設計技巧稱為遞迴 recursion 遞迴函式結構清晰,很直觀的理解計算過程,但也有嚴重缺點 相對於普通迴圈而言,遞迴執行效率較低,經過很多冗餘的計算,遞迴會消耗大量的呼叫堆疊。在計算機中,函式呼叫是通過棧 stack 這種資料結構實現的,每當進入乙個函式呼叫,棧...
python 迭代和遞迴
1.迭代協議是指 物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起乙個stopiteration的異常,以終止迭代 只能往前走,不能回退 2.可迭代物件 實現了迭代協議的物件 如何實現 物件內部定義乙個 iter 方法 3.協議是一種約定,可迭代物件實現了迭代協議,pyth...
遞迴和迭代 迭代與遞迴
很多程式設計小白都會遇到 迭代 和 遞迴 的問題 包括我自己 大部分同學還是不知道迭代與遞迴的區別。下面我就嘗試用最通俗易懂的模式講解遞迴與迭代的區別。1.迭代 迭代其實很簡單,我們在程式設計中經常用到迭代。比如說 i 1 print i 這個就是乙個迭代,沒想到吧。迭代的意思其實就是在迴圈 現了參...