递归:简单来说就是自己调用自己
这里我们又要举个例子来说明递归能做的事情。
例一:
现在你们问我,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) + 2
age(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 40 else: ret=f(n-1)+2 return ret print(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)//2 if 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)//2 if 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 mid else: 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 key elif 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]) : continue threeLM(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)