在很多项目中用上迭代或者堆栈思想,会使问题简化很多,并且代码简洁,易于理解,这两种方法的掌握很考验程员的逻辑思维能力和应用简洁方法解决问题的决心。
先上个递归函数实现逐级查询的例子:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } #一项包含多项内容的也适用dictionary def threeLM(dic): #递归一定是递归函数了 while True: for k in dic:print(k) #打印menu的key,也就是打印一级菜单,北京,上海等 key = input('input>>').strip() if key == 'b' or key == 'q':return key #如果本次函数返回q或者b,则结束本次函数,返回值返回给上次函数被调用处 elif key in dic.keys() and dic[key]: #如果用输入的内容是menu的key的一个 ret = threeLM(dic[key]) # 就再调用这个函数,把这个key的值传给函数,接着打印下级菜单 if ret == 'q': return 'q' #如果下次函数返回的值是q,则结束本次函数,把q返回给上次函数,一直返回到第一层,然后结束函数 threeLM(menu)
再来个堆栈实现逐级查询的例子:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } #一项包含多项内容的也适用dictionary l = [menu] #堆栈常用开头,给个列表,把嵌套的字典放入列表 while l: for key in l[-1]:print(key) #打印menu的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() #如果输入b,则删除列表中的最后一项,那么下次循环,打印的一定是上级菜单 elif k == 'q':break #如果输入q,那么循环停止,程序结束
这两种方法,还是堆栈更容易理解一些,以后凡是遇到数据逐级查询的需求,一定要试着往堆栈的方向上想