day 16 递归

递归:
一个函数在内部调用自己
递归的层数在python里是有限的 997/998

解耦:
要完成一个完整的功能,但这个功能的规模要尽量小,
并且和这个功能无关的其他代码应该和这个函数分离。
1.增强代码的重要性。
2.减少代码变更的互相影响。

#写递归函数必须要有一个结束条件

#alex
#1 alex egon + 2   n=1  age(1) = age(2) + 2
#2 egon wusir + 2  n=2  age(2) = age(3) +2
#3 wusir 金鑫 + 2  n=3  age(3) = age(4) +2
#4 金鑫 40         n=4  age(4) = 40

def age(n):
    if n == 4:
        return 40
    return age(n+1)+2

#age(1)   #46
# def age(1):
#     return 46
#
# def age(2):
#     return 44
#
# def age(3):
#     return 42
#
# def age(4):
#     if 4 == 4:
#         return 40
递归例子 年龄递加2

二分查找

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 search(num,l,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 :   #17,17
        return search(num,l,start,mid-1)
    elif l[mid] < num:
        return search(num,l,mid+1,end)
    elif l[mid] == num:
        return mid

print(search(66,l))
# def search(num,l,start=None,end=None): #66,[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]
#     start = start if start else 0      #start = 0
#     end = end if end else len(l) - 1   #end = 24
#     mid = (end - start)//2 + start     #mid = 12
#     if l[mid] > num :                  #l[mid] = 41  <  66
#         search(num,l,start,mid-1)
#     elif l[mid] < num:
#         ret = search(num,l,mid+1,end)        #search(66,l,13,24)
#         return ret
#     elif l[mid] == num:
#         return mid, l[mid]
# 
# def search(num,l,start=None,end=None): #66,[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]
#     start = start if start else 0      #start = 13
#     end = end if end else len(l) - 1   #end = 24
#     mid = (end - start)//2 + start     #mid = 18
#     if l[mid] > num :                  #l[mid] = 67  >  66
#         search(num,l,start,mid-1)      #search(66,l,13,17)
#     elif l[mid] < num:
#         ret = search(num,l,mid+1,end)
#         return ret
#     elif l[mid] == num:
#         return mid, l[mid]
# 
# def search(num,l,start=None,end=None): #66,[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]
#     start = start if start else 0      #start = 13
#     end = end if end else len(l) - 1   #end = 17
#     mid = (end - start)//2 + start     #mid = 15
#     if l[mid] > num :                  #l[mid] = 56  <  66
#         search(num,l,start,mid-1)
#     elif l[mid] < num:
#         ret = search(num,l,mid+1,end)        #search(66,l,16,17)
#         return ret
#     elif l[mid] == num:
#         return mid, l[mid]
# 
# def search(num,l,start=None,end=None): #66,[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]
#     start = start if start else 0      #start = 16
#     end = end if end else len(l) - 1   #end = 17
#     mid = (end - start)//2 + start     #mid = 16
#     if l[mid] > num :                  #l[mid] = 56  <  66
#         search(num,l,start,mid-1)
#     elif l[mid] < num:
#         ret = search(num,l,mid+1,end)        #search(66,l,17,17)
#         return ret
#     elif l[mid] == num:
#         return mid, l[mid]
# 
# def search(num,l,start=None,end=None): #66,[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]
#     start = start if start else 0      #start = 17
#     end = end if end else len(l) - 1   #end = 17
#     mid = (end - start)//2 + start     #mid = 17
#     if l[mid] > num :                  #l[mid] = 66  ==  66
#         search(num,l,start,mid-1)
#     elif l[mid] < num:
#         search(num,l,mid+1,end)
#     elif l[mid] == num:
#         return mid, l[mid]               #return 17,66
二分查询 过程

三级菜单

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}
#相同的数据类型 嵌套在一起

def Three_Level_Menu(menu):
    while True:
        for k in menu:print(k)
        key = input("<<<")
        if key == "q":return "q"
        elif key =="b":break
        elif key in menu:
            ret = Three_Level_Menu(menu[key])
            if ret == "q":return "q"
Three_Level_Menu(menu)
三级菜单用递归实现

 

posted @ 2017-09-06 18:45  mendax  阅读(79)  评论(0)    收藏  举报