函数递归
遞歸:簡單來說就是自己調用自己
這里我們又要舉個例子來說明遞歸能做的事情。
例一:
現在你們問我,alex老師多大了?我說我不告訴你,但alex比 egon 大兩歲。
你想知道alex多大,你是不是還得去問egon?egon說,我也不告訴你,但我比武sir大兩歲。
你又問武sir,武sir也不告訴你,他說他比金鑫大兩歲。
那你問金鑫,金鑫告訴你,他40了。。。
這個時候你是不是就知道了?alex多大?
| 1 | 金鑫 | 40 |
| 2 | 武sir | 42 |
| 3 | egon | 44 |
| 4 | alex | 46 |
你為什么能知道的?
首先,你是不是問alex的年齡,結果又找到egon、武sir、金鑫,你挨個兒問過去,一直到拿到一個確切的答案,然后順著這條線再找回來,才得到最終alex的年齡。這個過程已經非常接近遞歸的思想。我們就來具體的我分析一下,這幾個人之間的規律。
age(5) = age(4) + 2age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 40
那這樣的情況下,我們的函數應該怎么寫呢?
?
__author__ = 'Administrator' def f(n):if n==1:return 40else:ret=f(n-1)+2return retprint(f(5))''' n=5 return f(4)+2=f(3)+4=f(2)+6=f(1)+8 '''遞歸實現二分算法
如果有這樣一個列表,讓你從這個列表中找到66的位置,你要怎么做?
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]
1.簡單版本 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]def f(l,aim):mid=len(l)//2if l[mid]>aim:return f(l[0:mid],aim)elif l[mid]<aim:return f(l[mid+1:],aim)else:return l[mid]print(f(l,66))
2.升級版本,找到位置
?
__author__ = 'Administrator' 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]def f(l,aim,start,end):mid=(start+end)//2if l[mid]>aim:return f(l,aim,start,mid-1)elif l[mid]<aim:return f(l,aim,mid+1,end)elif l[mid]==aim:return midelse:print("找不到")print(f(l,66,0,len(l)-1))遞歸函數與三級菜單
menu = {'北京': {'海淀': {'五道口': {'soho': {},'網易': {},'google': {}},'中關村': {'愛奇藝': {},'汽車之家': {},'youku': {},},'上地': {'百度': {},},},'昌平': {'沙河': {'老男孩': {},'北航': {},},'天通苑': {},'回龍觀': {},},'朝陽': {},'東城': {},},'云南': {'昆明': {"官渡區": {'阿拉村':{},'大板橋':{},'官渡廣場':{},'關上':{}},"五華區":{},'呈貢':{}},'曲靖': {'宣威': {'美幻廣場': {},'宛水公園': {},'東山': {}},'麒麟區': {'麒麟公園': {},'珠江源廣場': {},'南城門廣場': {}},'沾益區': {'玉林山水': {},'小花園': {},},},'玉溪': {'紅塔區': {'紅塔集團': {},'聶耳廣場': {}},'澄江縣': {'撫仙湖': {},'黃金海岸': {},},'通海縣': {'銅鍋飯': {},'石鍋魚': {},}},},'山東': {}, } def threeLM(dic):while True:for k in dic:print(k)key = input('input>>').strip()if key == 'b' or key == 'q':return keyelif key in dic.keys() and dic[key]:ret = threeLM(dic[key])if ret == 'q': return 'q'elif (not dic.get(key)) or (not dic[key]) :continuethreeLM(menu)?
def fun(s):while True:for k in s:print(k)dd=input("input>>:").strip()if dd in s:fun(s[dd])elif dd=="back":break fun(menu)?
轉載于:https://www.cnblogs.com/ctztake/p/7265163.html
總結
- 上一篇: ubuntu 查看网卡 数据包处理 速度
- 下一篇: Swift函数