【Python全棧筆記】08 [模塊二] 20 Oct 遞歸 -*** 待補充

遞歸 python

 

引入 遞歸的表現形式 app

下面是四個函數,互相調用返回結果 函數

# 引入 遞歸的表現形式

def f1():
    return '1'


def f2():
    r = f1()
    return r


def f3():
    r = f2()
    return r


def f4():
    r = f3()
    return r

result = f4()
print(result)
# 最後輸出結果 1

除了依次調用其餘函數,函數也能夠調用本身spa

下面的f1()函數一直在調用本身,至關於一個死循環,python內部有機制,當遞歸調用到必定數量的時候就會報錯中止調用了。 code

1 def f1():
2     f1()
3 
4 f1() 
5 
6 # 報錯: RecursionError: maximum recursion depth exceeded

經典的遞歸用法有斐波那契數列: blog

 1 # 遞歸的典型應用,斐波那契數列
 2 def fib(x, y):
 3 
 4     if x + y > 1000:
 5         return
 6     z = x + y
 7     fib_list.append(z)
 8     fib(y, z)
 9     return fib_list
10 
11 fib_list = [0, 1]
12 result = fib(0, 1)
13 print(result)
14 # 獲得結果:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

斐波那契數列加上循環的次數限制:遞歸

 1 # 執行了10次後斐波那契數列的結果
 2 
 3 def fib_counts(counts, x, y):
 4     if counts == 11:
 5         return fib_list
 6     z = x + y
 7     fib_list.append(z)
 8     r = fib_counts(counts + 1, y, z)
 9     return r
10 
11 fib_list = [0, 1]
12 result = fib_counts(1, 0, 1)
13 print(result)
14 # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

注意:繼續調用函數要有一個返回值來return io

課堂失敗案例: class

 1 def num(a, b, n):
 2     if n == 10:
 3         return a
 4     c = a + b
 5     num(b, c, n+1)
 6     return a
 7 s = num(0, 1, 1)
 8 print(s)
 9 # 上面的num(b, c, n+1) 沒有返回,直接返回了傳入的最原始參數a 結果爲0
10 # 由於下一次執行的函數拿到數值後要往上一層傳遞,可是上一層沒有接收的地方,等於無用功
11 
12 
13 # 修改爲以下便可:
14 def num(a, b, n):
15     if n == 10:
16         return a
17     c = a + b
18     r = num(b, c, n+1)
19     return r
20 
21 s = num(0, 1, 1)
22 print(s)
23 # 結果返回34

補充:循環

漢諾塔遞歸

相關文章
相關標籤/搜索