ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python旅途——函数的递归和栈的使用

2019-07-11 20:03:18  阅读:171  来源: 互联网

标签:菜单 递归 Python menu inp lst func 旅途


Python——函数之递归、栈的使用

今天主要和大家分享函数的递归,同时引入一个新的概念——栈

1.递归

1.定义

函数的递归指的就是函数自己调用自己,什么是函数自己调用自己呢?我们来看一个栗子:

这里给大家一个数学中的一个数列:斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,它指的是前两项的和等于第三项,那么我们对于这样的需求如何用Python代码实现呢?这个时候就用到了函数的递归

def func(arg1,arg2):
    if arg1 == 0:
        print(arg1,arg2)
    # 拿到第三个值
    arg3 = arg1 + arg2 
    print arg3
    #将第二个值和第三个值作为参数继续传入函数中
    func(arg2,arg3)    
# 将斐波那契数列的前两项0,1传入函数  
func(0,1)                    

通过上面的这个例子,是不是对于递归有了一定的理解呢,但是递归本身是属于自己本身调用自己,这种方式是一种效率低,且消耗内存的一种方式

2.用递归实现三级菜单

三级菜单我们平时都是很常见的,像是在淘宝里买东西的时候,需要我们填写地址,这些操作我们仔细想想都是三级菜单,而且我们也可以通过递归来操作

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

def menu_func(menu):
    while True:
        # 循环打印menu,得到对应的键:北京、上海、广州
        for key in menu:                              
            print(key)
        inp = input('请输入要查询的地址(q退出,b返回上一级):').strip()
        if inp.upper() == 'Q': return 'q'
        if inp.upper() == 'B': return 'b'
         # 判断能否拿到对应正确的值
        elif menu.get(inp):      
            # 使用递归将用户输入的值再次进行循环打印显示                    
            flag = menu_func(menu[inp])    
            # 一层一层的return进行退出
            if flag == 'q': return 'q'                  
menu_func(menu)

2.栈lifo

这里在给大家介绍一个新的概念(数据结构)——栈 lifo(last in first out即后进先出)。

栈的特点就是后进先出,顾名思义,就是最后进来的数据要最先出去。那么上面的我们用递归实现的三级菜单,使用栈应该怎么实现呢?

# 三级菜单
# 栈
menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}
 # 先将整个大的字典放在一个列表中
lst = [menu]    
#当列表不为空的时候,我们开始循环               
while lst:  
    #取列表的最后一项,即当前的大字典                    
    for key in lst[-1]: 
        # 北京                
        print(key)
    inp = input('>>>')
    # 输入q直接退出循环              
    if inp.upper() == 'Q':break 
    #返回上一级的时候,对列表进行pop,这样会默认删除掉列表最后的那个元素,对于再次循环列表时,拿到的最后一个元素就是上一层的菜单         
    elif inp.upper() == 'B':lst.pop() 
    # 从字典中取出你输入的地址,又对应拿到下一层的菜单                                                                                                 
    elif lst[-1].get(inp): 
        # 将对应的下一级菜单添加到列表中的最后一个位置上,反复循环。          
        lst.append(lst[-1][inp])         

以上就是函数的递归以及栈的相关分享。

标签:菜单,递归,Python,menu,inp,lst,func,旅途
来源: https://www.cnblogs.com/guoruijie/p/11172191.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有