递归:简单来说就是自己调用自己

这里我们又要举个例子来说明递归能做的事情。

例一:

现在你们问我,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)
复制代码
posted on 2019-03-08 15:59  Zander-zhao  阅读(212)  评论(0编辑  收藏  举报