1. 程式人生 > 實用技巧 >遞迴函式

遞迴函式

目錄

遞迴函式

函式的遞迴呼叫: 就是在呼叫一個函式的過程中又直接或間接的呼叫了自己
示例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))