遞歸 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
補充:循環
漢諾塔遞歸