一、遞迴
1、遞迴的介紹
什麼是遞迴?
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式語言中廣泛應用。 乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。遞迴的能力在於用有限的語句來定義物件的無限集合。一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。
遞迴要注意的是,它是直接或間接呼叫自身,所以在使用遞迴時,必須有乙個明確的遞迴結束條件,稱為遞迴出口,否則,他就會陷入死迴圈。
尾遞迴如果乙個函式中所有遞迴形式的呼叫都出現在函式的末尾,我們稱這個遞迴函式是尾遞迴的。當遞迴呼叫是整個函www.cppcns.com數體中最後執行的語句且它的返回值不屬於表示式的一部分時,這個遞迴呼叫就是尾遞迴。www.cppcns.com尾遞迴函式的特點是在回歸過程中不用做任何操作,這個特性很重要,因為大多數現代的編譯器會利用這種特點自動生成優化的**。
python不是一門函式式程式語言,本身不支援尾遞迴(沒有對尾遞迴做優化),而且對遞迴的次數有限制,當遞迴深度超過1000時,會丟擲異常,雖然可以通過sys模組修改提櫃的深度,,但是因為不是尾遞迴,仍然要儲存棧,記憶體大小一定,不可能無限遞迴,而且無限制地遞迴呼叫本身是毫無意義的
import sys
sys.getrecursionlimit()
sys.setrecursio # 修改遞迴深度為2000
2、遞迴的應用
遞迴分為兩個階段:回溯和遞推
遞推 : 把複雜的問題的求解推到比原問題簡單一些的問題的求解;
回溯 : 當獲得最簡單的情況(遞迴出口)後,逐步返回,依次得到複雜的解
下面通過乙個例子來分析這個過程 :
這是乙個十進位制轉化為二進位制的函式,十進位制轉化為二進位制就www.cppcns.com是 將十進位制不斷地除以2,直到商為0,然後將餘數從後到前排列起來
def decbin(x):
result = ''
if x:
return decbin(x // 2) + str(x % 2)
else:
return result
print(decbin(7))
當我們傳入x為7時,很明顯x不為0,所以我們便進入了下次一迴圈,注意這時的第一層函式並沒有結束,而是一直在等待著下一層函式的返回結果。接著進入了第二層函式,引數為3,很明顯也不為0,接著又進入了第三層函式,此時第二層函式也在等待下一層函式的返回結果,以此類推,這就是遞迴函式的回溯。當我們的引數為0的時候,便會執www.cppcns.com行else的**,這時候函式就不再回溯,而是開始往前遞推。
二、迭代與遞迴
1、什麼是迭代?
python中的迭代是指通過重複執行的**處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。常見的for迴圈遍歷物件就是迭代。
2、用python實現遞迴演算法,**結構較為簡單,但效率非常低下,而迭代演算法可讀性強,執行效率也非常之快。所以在運用遞迴演算法時應謹慎。
本文標題: python中的函式遞迴和迭代原理解析
本文位址:
Python遞迴和迭代
遞迴 在函式內部,呼叫函式自身的程式設計技巧稱為遞迴 recursion 遞迴函式結構清晰,很直觀的理解計算過程,但也有嚴重缺點 相對於普通迴圈而言,遞迴執行效率較低,經過很多冗餘的計算,遞迴會消耗大量的呼叫堆疊。在計算機中,函式呼叫是通過棧 stack 這種資料結構實現的,每當進入乙個函式呼叫,棧...
Python遞迴和迭代
遞迴 在函式內部,呼叫函式自身的程式設計技巧稱為遞迴 recursion 遞迴函式結構清晰,很直觀的理解計算過程,但也有嚴重缺點 相對於普通迴圈而言,遞迴執行效率較低,經過很多冗餘的計算,遞迴會消耗大量的呼叫堆疊。在計算機中,函式呼叫是通過棧 stack 這種資料結構實現的,每當進入乙個函式呼叫,棧...
python 迭代和遞迴
1.迭代協議是指 物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起乙個stopiteration的異常,以終止迭代 只能往前走,不能回退 2.可迭代物件 實現了迭代協議的物件 如何實現 物件內部定義乙個 iter 方法 3.協議是一種約定,可迭代物件實現了迭代協議,pyth...