首先说一下在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