经典思路题(2)三级菜单实现
三级菜单实现
1、函数递归实现三级菜单
需求:一级一级进入内层菜单,按b返回上一层菜单,按q直接退出
 
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' threeLM(menu)
解析:
这个实现过程核心点是理解函数递归返回值的处理,递归函数上一层在接受里层函数返回值时,一直在等待拿到结果然后执行后续代码,以及关键字return终止函数,然后就是while循环和递归结合使用产生的巧妙反映。
首先遍历字典,打印菜单的键,获取用户输入,如果用户输入在字典的键中,进入递归,这个都很好理解,关键在于判断返回值这个地方,假如我们先获取的输入是北京,我们进入递归第二层,此时打印了北京对应字典下面的菜单:海淀、昌平、朝阳、东城。
这时如果我们获取的继续是字典中的键,则进入第三层递归函数,并打印菜单,获取输入,但是如果我们此时获得的是b,因为输入等于b,函数直接return b,执行了return语句,第二层递归函数终止,并将'b'返回给第一层等待着的ret,然后执行判断ret是不是等于'q',发现不是,此时while循环完一次,又进入循环,打印第一层函数的菜单,从而达到了返回上级菜单的效果;
回到第二层递归的时候,如果我们此时输入的是'q',函数判断key=='q',执行return 'q',第二层递归函数结束,第一层递归的ret可以拿到第二层递归的返回值,发现ret的值是'q',满足条件,此时第一层递归函数又执行return ‘q’,第一层函数就又停止了,此时所有递归函数就一层一层调出来了。也就实现了退出全部的效果。
通过上面的理解,如果我们在第三层递归函数中,同样的道理,如果我们获取的是'q',第三层将'q'返回给第二层,第二层函数判断返回值,发现等于'q',有返回给第一层,第一层也满足条件,直接返回'q',第一层函数也停止了。
2、堆栈方法实现三级菜单
 
l = [menu] while l: for key in l[-1]:print(key) k = input('input>>').strip() # 北京 if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k]) elif k == 'b':l.pop() elif k == 'q':break
解析:
堆栈的思路,就是根据你输入的值

 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号