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旅途——函数的递归和栈的使用的更多相关文章

  1. Python之函数、递归、内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  2. python学习:函数的递归调用

    计算阶层   普通方法: -使用循环   #!/usr/bin/python   def factorial(n):     sum = 1     for i in range(1,n+1):   ...

  3. Python之函数的递归、匿名函数、内置函数

    一.函数的递归 ''' 1 什么是函数递归 函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调 ...

  4. trampoline蹦床函数解决递归调用栈问题

    递归函数的调用栈太多,造成溢出,那么只要减少调用栈,就不会溢出.怎么做可以减少调用栈呢?就是采用"循环"换掉"递归". 下面是一个正常的递归函数. functi ...

  5. Python旅途——函数(1)

    函数 简介 到目前为止,我们一直所接触的都是属于面向过程编程,这样的代码会降低代码的可读性,因此引入了函数式编程,在后面我们还会学到面向对象编程. 函数式编程 函数本质:将N行代码拿到别处,并给他起个 ...

  6. Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数

    一.深浅拷贝 1.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy # 定义变量 数字.字符串 # n1 = 123 n1 ...

  7. Day3 - Python基础3 函数、递归、内置函数

    Python之路,Day3 - Python基础3   本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...

  8. Python函数学习——递归

    递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 函数实现过程 def calc(n): v = int(n//2) print(v) if v > ...

  9. 匿名函数python内置高阶函数以及递归

    匿名函数 python定义一个函数通常使用def关键词,后面跟函数名,然后是注释.代码块等. def func(): '''注释''' print('from func') 这样就在全局命名空间定义了 ...

随机推荐

  1. 注册.NET Framework 到IIS服务器

    一.注册.NET 4.0 32位的Windows:--------------------------------------------------------------------------- ...

  2. WPF绑定到linq表达式

    using ClassLibrary;using System;using System.Collections.Generic;using System.Collections.ObjectMode ...

  3. 待修 Bug

    # 乱码 ## 描述 环境:Tomcat 8 + Spring 4 + Spring Security. 问题描述: 在类 AbstractAnnotationConfigDispatcherServ ...

  4. MVC EF Code First

    1 在Models里面创建类,用[Key]特性指定主键: 2 在Model里面增加导航属性: 3 在web.config里面增加连接字符串 4 创建继承于DbContext的类 5 创建Control ...

  5. PHP 一致性Hash

    一致性HASH 好久没有写文章了,最近忙着公司的事情,也一拖再拖.这篇一致性hash是很久之前就有的一篇算法,记录一下,这周写个基于该算法的Redis中间件. HASH算法的精髓就在于打散原本杂乱无序 ...

  6. 规则“Microsoft Visual Studio 2008 的早期版本”失败。此计算机上安装了 Microsoft Visual Studio 2008 的早期版本。请在安装 SQL Server 2008 前将 Microsoft Visual Studio 2008 升级到 SP1。

    今天重装了一下系统后,需要装开发工具,我用的开发工具是Visual Studio2008 和SQL Server2008R2,装完Visual Studio2008的时候在装数据库的时候却出现这样的问 ...

  7. windows界面程序设计,设置一个窗口始终在屏幕最前,SetWindowPos函数

    有时这种需求还是很必须的,比如现在做的一个登录验证系统,如果在windows登录界面点击到窗口外面,那窗口就会永远隐藏掉没法再启用了.这种情况必须设置该窗口一直在最前. 使用函数SetWindowPo ...

  8. 压缩大文件时如何限制CPU使用率?----几种CPU资源限制方法的测试说明

    一.说明 我们的MySQL实例在备份后需要将数据打包压缩,部分低配机器在压缩时容易出现CPU打满导致报警的情况,需要在压缩文件时进行CPU资源的限制. 因此针对此问题进行了相关测试,就有了此文章. 二 ...

  9. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项。

    “/”应用程序中的服务器错误. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项. 说明: 执行当 ...

  10. 【Python】:拓展Queue实现有序不重复队列

    最近手头有个需求是这样的,定期检查数据库获取失败任务并且进行重启.最早想到的是添加一个生产者&&消费者队列,但是发现很多棘手的问题. 1.重启任务是调用的一个shell脚本然后在脚本中 ...