1.递归实现三级菜单:
menu={ '河南':{ '商丘':{ '夏邑':{}, '县1':{} }, '郑州':{ '县1':{}, '县2':{} }, '开封':{ '县1':{}, '县2':{} } }, '吉林':{ '市1':{ '县1':{}, '县2':{} }, '市2':{ '县1':{}, '县2':{} } }, '厦门': { '市1': { '县1': {}, '县2': {} }, '市2': { '县1': {}, '县2': {} } } } def func(menu): while True: # 每一个菜单都可以被反复输出,执行 for key in menu: print(key) # 对于进到的每一级菜单都进行输出该级菜单名称 k=input(">>>") if k in menu and menu[k]: # 如果输入的菜单名 在字典中,并且key对应的value 是有值的 ret=func(menu[k]) # 就不断递归调用下一级菜单 然后我们再去这个函数从头到尾再执行一遍,然后打印该级别菜单名字 重新输入,要进入哪一级菜单 if ret == 'q': # 如果这时候不想继续进入下一级菜单,q 的话 就要退出该级菜单,该级菜单的函数执行就得结束,但是得告诉上一级函数,我不想执行了,返回一个标志,让上一级函数去处理 break elif ret=='b': # 如果该下级菜单k输入的是b 就是不想继续进入下级菜单,想要返回,那该级菜单函数也不要继续执行了,得return 然后给上一级函数一个标志b 这里continue 当上层函数收到ret=b 时就会继续在该层函数不断执行 continue elif k=='b' or k=='q': return k # 这是针对下一级菜单的,如果输入k= b or q 函数就不要再继续执行了,只需要给上层函数返回个标志 else: continue # 当一直进入下一级菜单,直到该层菜单无法继续进入menu[k]为{} 这时 就在该层不断循环,提示用户输入,而不再递归调用下层函数(因为没有了) func(menu)
运行结果:
2. 堆栈实现(不用递归)实现三级菜单
menu={ '河南':{ '商丘':{ '夏邑':{}, '县1':{} }, '郑州':{ '县1':{}, '县2':{} }, '开封':{ '县1':{}, '县2':{} } }, '吉林':{ '市1':{ '县1':{}, '县2':{} }, '市2':{ '县1':{}, '县2':{} } }, '厦门': { '市1': { '县1': {}, '县2': {} }, '市2': { '县1': {}, '县2': {} } } } L=[menu] while L: for key in L[-1]: print(key) k=input('>>>') if k in L[-1].keys() and L[-1][k]: # 如果输入的名字在该级菜单中,并且下一级菜单有值 L.append(L[-1][k]) # 就把下一级菜单加入L列表,等下一次循环,拿到的key就是这个新的菜单列表了,因为append,L[-1]刚好取最新的一级菜单 elif k=='b': # 如果输入的是b 就是退回上一级菜单,只需要把现在L列表中最新的这个下级菜单删掉就行了 L.pop() elif k=='q': # 如果是q 就直接退出就好了 break
运行结果: