一、遞歸
一個函數在內部調用自己的函數稱為遞歸,遞歸的次數在python是有限制的,默認遞歸次數是997次。
count=0 def func(): global count count+=1 print(count) func() func() #最大打印出997,最后報錯:RecursionError
修改默認遞歸次數的方法如下:
import sys sys.setrecursionlimit(修改后的值)
二、遞歸實例
寫遞歸函數必須要有結束條件
1、alex年齡實例:alex比*大2歲,*比**大2歲,**比***大2歲,***40歲
def age(n): if n==4: return 40 return age(n+1)+2 print(age(1)) #age(1)>>>age(2)+2>>>age(3)+2+2>>>age(4)+2+2+2>>>46
2、數字n階乘實例
def func(n): if n==1: return 1 else: return n*func(n-1) print(func(7))
3、二分法查找列表l中數字num的索引
#查找的數必須存在的情況 def search(l,num,start=None,end=None): start=start if start else 0 end=end if end else len(l)-1 mid=(end-start)//2+start if l[mid]>num: return search(l,num,start,mid-1) elif l[mid]<num: return search(l,num,mid+1,end) elif l[mid]==num: return mid l = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88] print(search(l, 68))
#兼容查找的數不存在的情況 def search(l,num,start=None,end=None): start=start if start else 0 end=end if end else len(l)-1 mid=(end-start)//2+start if start>end: return None elif l[mid]>num: return search(l,num,start,mid-1) elif l[mid]<num: return search(l,num,mid+1,end) elif l[mid]==num: return mid l = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88] print(search(l, 68))
4、三級菜單實例:
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '網易': {}, 'google': {} }, '中關村': { '愛奇藝': {}, '汽車之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龍觀': {}, }, '朝陽': {}, '東城': {}, }, '上海': { '閔行': { "人民廣場": { '炸雞店': {} } }, '閘北': { '火車戰': { '攜程': {} } }, '浦東': {}, }, '山東': {}, } def three_level_menu(menu): while True: for key in menu: print(key) k=input('>>>') if k=='q':return 'q' elif k=='b':break elif k in menu: ret=three_level_menu(menu[k]) if ret=='q':return 'q' three_level_menu(menu)
5、輸出斐波那契第n個數
def fib(n): if n==1 or n==2: return 1 return fib(n-1)+fib(n-2)
6、有一個數據結構如下所示,請編寫⼀個函數從該結構數據中返回由指定的字段和對應的值組成的字典。如果指定字段不存在,則跳過該字段。
data={"time":"2016-08-05T13:13:05",
"some_id":"ID1234",
"grp1":{ "fld1":1,"fld2":2},
"xxx2":{ "fld3":0,"fld5":0.4},
"fld6":11,
"fld7":7,
"fld46":8}
fields:由"|"連接的以"fld"開頭的字符串,如:fld2|fld3|fld7|fld19
#思路一: def select(data,fields): result = {} field_lst = fields.split('|') for key in data: if key in field_lst: result[key] = data[key] elif type(data[key]) == dict: res = select(data[key],fields) result.update(res) return result data={"time":"2016-08-05T13:13:05", "some_id":"ID1234", "grp1":{ "fld1":1,"fld2":2}, "xxx2":{ "fld3":0,"fld5":0.4}, "fld6":11, "fld7":7, "fld46":8} fields = 'fld2|fld3|fld7|fld19' print(select(data,fields))
#思路二: def select(data,fields,result = {}): field_lst = fields.split('|') for key in data: if key in field_lst: result[key] = data[key] elif type(data[key]) == dict: select(data[key], fields) return result data={"time":"2016-08-05T13:13:05", "some_id":"ID1234", "grp1":{ "fld1":1,"fld2":2}, "xxx2":{ "fld3":0,"fld5":0.4}, "fld6":11, "fld7":7, "fld46":8} fields = 'fld2|fld3|fld7|fld19' select(data,fields) print(select(data,fields))