一、什麼是遞歸
如果函數包含了對其自身的調用,該函數就是遞歸的。遞歸做為一種演算法在程式設計語言中廣泛應用,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需的多次重複計算,大大減少了程式的程式碼量。例如,要計算1-9的9位數的乘積,直覺的演算法是1*2*3*4*5*6*7*8*9,如果要計算1-10000的乘積,直覺的演算法就難於實作出,而遞歸就可以很簡單的實作。請看範例:
def fact(n):#计算给定数字到一的乘积 if n<=1: return 1 else: return n * fact(n-1) print (fact(7))
結果是:5040
下面我們用範例來看看遞迴的執行過程:
def calc(n): print(n) if n/2 > 1: res = calc(n/2) return n calc(8)
結果為:
8 4.0 2.0
再看這一個範例:
def calc(n): print(n) if n/2 > 1: res = calc(n/2) print('res:',res) print("N:",n) return n calc(8)
#結果為:
8 4.0 2.0 N: 2.0 res: 2.0 N: 4.0 res: 4.0 N: 8
二、生成器
#生成器是一個帶有yield 語句的函數。一個函數或子 程式只回傳一次,但一個生成器能暫停執行並傳回一個中間的結果,返 回一個值給呼叫者並暫停執行。當生成器的next()方法被呼叫的時候,它會準確地從離開地方繼續
下面看範例:
def func(): print('11111111') yield [1] print(2222222222) yield 2 print(3333333333) yield 3 ret=func() r1=ret.__next__() print(r1) r2=ret.__next__() print(r2) r3=ret.__next__() print(r3)
結果為:
11111111 [1] 2222222222 2 3333333333 3
由於python 的for 迴圈有next()呼叫和對StopIteration 的處理, 使用一個for 迴圈而非手動迭代穿過一個生成器(或那種事物的迭代器)總是要簡潔漂亮得多。例:
def func(): print('11111111') yield [1] print(2222222222) yield 2 print(3333333333) yield 3 ret=func() for i in ret: print(i)
結果與前面相同。
這些簡單的範例應該會讓你有點明白生成器是如何運作的。除了next()來獲得下個產生的值,使用者可以將值回送給生成器[send()],在生成器中拋出異常,並且要求生成器退出[close()]
下面是一個展示了這些特性的,簡單的範例。
def counter(start_at=0): count = start_at while True: val = (yield count) if val is not None: count = val else: count += 1
產生器帶有一個初始化的值,對每次對生成器[next()]呼叫以 1 累加計數。使用者已可以選擇重 置這個值,如果他們非常想要用新的值來呼叫 send()不是呼叫 next()。這個生成器是永遠運作的,所以如果你想要終結它,呼叫 close()方法。如果我們互動的運行這段程式碼,會得到以下輸出:
>>> count = counter(5) >>> count.next() 5 >>> count.next() 6 >>> count.send(9) 9 >>> count.next() 10 >>> count.close() >>> count.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
以上這篇深入理解python函數遞迴與產生器就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持PHP中文網。
更多python函數遞歸和生成器相關文章請關注PHP中文網!