遞迴函式
阿新 • • 發佈:2020-07-24
目錄
遞迴函式
函式的遞迴呼叫: 就是在呼叫一個函式的過程中又直接或間接的呼叫了自己
示例1: 直接呼叫自己
def foo():
print('hello')
foo()
foo()
示例2: 間接呼叫了自己
def bar():
print('from bar')
foo()
def foo():
print('hello')
bar()
foo()
為何死遞迴會丟擲異常?
因為無限的遞迴會導致記憶體溢位, 所以python設定了最大的遞迴層數
import sys
print(sys.getrecursionlimit()) # 可以修改層數
所以: 不應該無限遞迴呼叫下去, 應該在滿足某種條件下結束遞迴呼叫, 然後返回
遞迴呼叫分為兩個階段
1, 回溯: 一層層的遞迴呼叫下去
2, 遞推: 在滿足某一條件的情況下結束回溯, 然後開始向上一層一層的返回
def salary(n): if n == 1: return 18 return salary(n - 1) + 10 res = salary(5) print(res) nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]] def func(l): for x in l: if type(x) is list: # 把自身的程式碼重新呼叫一次 func(x) else: print(x) func(nums)
從小到大排列的一個數字列表
nums = [11, 13, 32, 47, 53, 73, 84, 91,101,111,222,333,444,5555]
def binary_search(l,find_num): if len(l)==0: print('find_num not exists') return mid_index = len(l) // 2 if find_num > l[mid_index]: right_l = l[mid_index+1:] binary_search(right_l,find_num) elif find_num < l[mid_index]: left_l = l[:mid_index] binary_search(left_l,find_num) else: print('find it') binary_search(nums,11)
三元表示式:表示式1 if 條件 else 表示式2
y = 111
x = 222
def max2(x,y):
if x > y:
return x
else:
return y
res = x if x > y else y
print(res)
匿名函式即沒用名字的函式
res = (lambda x,y:x+y)(1,2)
print(res)
f= lambda x,y:x+y
print(f)
f(1,2)
特點:沒有名字意味著只能用一次,用完之後就是垃圾,所以匿名函式只用於臨時使用一次的場景
salaries = {
"egon":4.4,
"lqz":3.3,
"yh":2.2
}
def func(k):
return salaries[k]
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k]))
print(sorted(salaries,key= lambda k:salaries[k],reverse=True))