递归脚本例子

首先说一下在while循环中,continue、break、return的作用。

continue:结束本次循环,开始下次循环。

break:结束循环,直接跳到循环外边去。

return:退出循环所在的函数,或者说是结束该方法。

1.三级菜单

menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}
需要打印的菜单菜单

要求:输入地名进入下一级,输入q退出,退出b返回。

def menu_2(menu):
    while True:
        for key in menu:
            print(key)
        choise = input('请选择:')
        if choise == 'q'or choise == "b":  如果输入b或q就直接退出,因为这本来就是第一层
            return choise
        elif choise in menu:
            bord = menu_2(menu[choise])   #在内循环中,q或b该层循环也结束了,只是退出那一层,如果要结束所有,还要传值。
            if bord == "q":      #如果输入q,该层结束还会传值到上层,上层接一个判断,然后一层一层结束。
                return "q"
menu_2(menu)

 另外一种使用压栈的思想做的也非常巧妙。

def menu_1(menu):
    list1 = [menu]
    while True:
        ssg = list1.pop()   #把末尾的剔除,第一次是一整个
        for i in ssg:
            print(i)
        choice = input(">>>")
        if choice in ssg.keys() and ssg[choice]:
            list1.append(ssg)      #删除一个,加两个
            list1.append(ssg[choice])
        if choice == "b":
            continue
        if choice == "q":
            break
menu_1(menu)

 

2.斐波那契数列,形式:1、1、2、3、5.....

def fob(n):
    if n == 1:
        return 1
    elif n ==2:
        return 1
    return fob(n-1) + fob(n-2)

print(fob(10))

递归的要素:有递有归。
函数值中对函数进行引用,说明结果的来源。

3.阶乘:1*2*3*4*5.....

def jc(n):
    if n == 1:
        return 1
    return n*jc(n-1)
print(jc(5))

4.二分法

lst = [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 func(l,aim):
    mid = (len(l)-1)//2
    if l:
        if aim > l[mid]:
            func(l[mid+1:],aim)
        elif aim < l[mid]:
            func(l[:mid],aim)
        elif aim == l[mid]:
            print("bingo",mid)
    else:
        print('找不到')
func(lst,66)
func(lst,6)

升级版

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

 

posted @ 2017-11-08 19:10  明王不动心  阅读(344)  评论(0编辑  收藏  举报