模擬遞迴生成器

2021-09-18 07:17:33 字數 1693 閱讀 4987

與遞迴生成器實現同樣的功能,不過這裡使用非生成器的方法來模擬。

def

flatten(nested):

result =

try:

for sublist in

nested:

for element in

flatten(sublist):

print('

element:

', element)

print('

rrrrrrrrrresult:

', result)

except

typeerror:

print

(nested)

return

result

a = flatten([[[1], 2], 3, 4, [5, [6, 7]], 8])

print

(a)輸出:

1element: 1rrrrrrrrrresult: [1]

element: 1rrrrrrrrrresult: [1]

2element: 2rrrrrrrrrresult: [1, 2]

element: 1rrrrrrrrrresult: [1]

element: 2rrrrrrrrrresult: [1, 2]

3element: 3rrrrrrrrrresult: [1, 2, 3]

4element: 4rrrrrrrrrresult: [1, 2, 3, 4]

5element: 5rrrrrrrrrresult: [5]

6element: 6rrrrrrrrrresult: [6]

7element: 7rrrrrrrrrresult: [6, 7]

element: 6rrrrrrrrrresult: [5, 6]

element: 7rrrrrrrrrresult: [5, 6, 7]

element: 5rrrrrrrrrresult: [1, 2, 3, 4, 5]

element: 6rrrrrrrrrresult: [1, 2, 3, 4, 5, 6]

element: 7rrrrrrrrrresult: [1, 2, 3, 4, 5, 6, 7]

8element: 8rrrrrrrrrresult: [1, 2, 3, 4, 5, 6, 7, 8]

[1, 2, 3, 4, 5, 6, 7, 8]

通過輸出可以看出,雖然最終的結果一樣,但是中間的element輸出卻不一樣。原因在於,yield每次返回時,當前的**就會被掛起,如果用return替代yield**就完全返回。所以實現同樣的功能,生成器每次遍歷到乙個值就逐層向上傳遞,而模擬遞迴函式得先儲存result中,把result逐層向上傳遞。此外,因為模擬**不能掛起**,所以必須得把底層**處理完,才能逐層返回,而生成器可以每次都挖到最底層。如此看來如果遞迴巢狀比較深,生成器的效率會比較低,因為每次都要從上到下。

上圖是兩者執行的示意圖,生成器每次生成乙個值都是從上往下搜,然後通過yield原路返回,而模擬遞迴是全部遍歷最終返回。

posted @

2018-12-04 18:55

mjl_cv 閱讀(

...)

編輯收藏

遞迴生成器

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...

Python遞迴生成器

學習python時,碰到乙個生成器的概念,有點意思,其實很簡單,基本上就是兩種策略 並不難,可以直接參考廖大的教程。這裡主要想說的是乙個程式,from python基礎教程 def yield test nested try for sublist in nested for element in ...