遞迴和生成器函式

2022-09-12 11:03:40 字數 2445 閱讀 9599

如果函式包含了對其自身的呼叫,該函式就是遞迴。遞迴廣泛應用於語言識別和使用遞迴函式的數學應用中。例如:斐波那契數列和求階乘等。下面就上面兩種使用舉例:

斐波那契數列:

in [12]: def fib(n):

if n==0:

return 1

if n==1:

return 1

return fib(n-2)+fib(n-1)

in [18]: fib(10)

out[18]: 89

階乘:

in [19]: def fn(n):

....: if n==0:

....: return 1

....: if n==1:

....: return 1

....: return n*fn(n-1)

in [20]: fn(10)

out[20]: 3628800

由於遞迴總是涉及到壓棧和出棧,所以遞迴函式在python中非常慢,並且有深度限制,所以盡量避免使用遞迴。在python中遞迴的限制可以通過 sys.getrecursionlimit() 得到深度限制,通過sys.setrecursionlimit調整遞迴深度限制。

注意:迴圈都可以轉化為遞迴,但不是所有遞迴都可以轉化為迴圈。

生成器函式是乙個帶yield語句的函式。乙個函式或者子程式只能返回一次,但乙個生成器能暫停執行並返回乙個中間的結果,這就是yield的功能,返回乙個值給呼叫者並暫停執行。當生成器被next()方法呼叫的時候,它會準確的從離開地方繼續。

請注意yield和return的區別:

in [50]: def gen(x):

....: for i in range(10):

....: if i ==3:

....: return i

....: yield i

in [51]: g = gen(10)

in [52]: for i in g:

....: print(i) 01

2

注意:可以使用生成器來替換遞迴,同時所有的遞迴,都可以用生成器替換。

in [54]: def fn1():

ret =1

index=1

while true:

yield ret

index += 1

ret *= index

in [55]: g1=fn1()

in [56]: next(g1)

out[56]: 1

in [57]: next(g1)

out[57]: 2

in [58]: next(g1)

out[58]: 6

in [59]: next(g1)

out[59]: 24

in [60]: next(g1)

out[60]: 120

def g(n):

def factorial():

ret = 1

idx = 1

while true:

yield ret

idx += 1

ret *= idx

gen = factorial()

for _ in range(n-1):

next(gen)

return next(gen)

in [63]: fn2(5)

out[63]: 120

in [64]: fn2(6)

out[64]: 720

生成器函式的列表傳參

在python2 中使用:

in [1]: lst = [1,2,3,4,5,7,9]

in [2]: def gen(lst):

...: for x in lst:

...: yield x

in [3]: g=gen(lst)

in [4]: for i in g:

...: print(i) 12

3457

9

在python3 中使用:

in [5]: def gen1(lst):

...: yield from lst

in [6]: g1=gen1(lst)

in [7]: for j in g1:

...: print(j)12

3457

9

python函式遞迴和生成器

一 什麼是遞迴 如果函式包含了對其自身的呼叫,該函式就是遞迴的。遞迴做為一種演算法在程式語言中廣泛應用,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 量。例如,要計算1 9的9位數字的乘積...

遞迴生成器

python基礎教程中 第2版 修訂版 p155頁有這樣一段 def flatten nested try for sublist in nested for element in flatten sublist yield element except typeerror yield nested...

遞迴生成器

python基礎教程中 第2版 修訂版 p155頁有這樣一段 def flatten nested try for sublist in nested for element in flatten sublist yield element except typeerror yield nested...