Python旅途——函数的递归和栈的使用
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旅途——函数的递归和栈的使用的更多相关文章
- Python之函数、递归、内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- python学习:函数的递归调用
计算阶层 普通方法: -使用循环 #!/usr/bin/python def factorial(n): sum = 1 for i in range(1,n+1): ...
- Python之函数的递归、匿名函数、内置函数
一.函数的递归 ''' 1 什么是函数递归 函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调 ...
- trampoline蹦床函数解决递归调用栈问题
递归函数的调用栈太多,造成溢出,那么只要减少调用栈,就不会溢出.怎么做可以减少调用栈呢?就是采用"循环"换掉"递归". 下面是一个正常的递归函数. functi ...
- Python旅途——函数(1)
函数 简介 到目前为止,我们一直所接触的都是属于面向过程编程,这样的代码会降低代码的可读性,因此引入了函数式编程,在后面我们还会学到面向对象编程. 函数式编程 函数本质:将N行代码拿到别处,并给他起个 ...
- Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数
一.深浅拷贝 1.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy # 定义变量 数字.字符串 # n1 = 123 n1 ...
- Day3 - Python基础3 函数、递归、内置函数
Python之路,Day3 - Python基础3 本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...
- Python函数学习——递归
递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 函数实现过程 def calc(n): v = int(n//2) print(v) if v > ...
- 匿名函数python内置高阶函数以及递归
匿名函数 python定义一个函数通常使用def关键词,后面跟函数名,然后是注释.代码块等. def func(): '''注释''' print('from func') 这样就在全局命名空间定义了 ...
随机推荐
- Linux IO模式
原文地址:https://segmentfault.com/a/1190000003063859 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- Android指纹识别
原文:Android指纹识别 上一篇讲了通过FingerprintManager验证手机是否支持指纹识别,以及是否录入了指纹,这里进行指纹的验证. //获取FingerprintManager实例 F ...
- GAC的一种非官方实现方式
1.GAC简介 全局程序集缓存(Global Assembly Cache, GAC)计算机范围内的代码缓存,它存储专门安装的程序集,这些程序集由计算机上的许多应用程序共享.在全局程序集缓存中部署的应 ...
- mariadb 允许远程访问
进入MariaDB服务器,将mysql.user的host字段的值改为%就表示在任何客户端机器上能以root用户登录到mysql服务器,建议在开发时设为%. 1 MariaDB [(none)]> ...
- WPF开发之限制输入的控件---------转自CDSN
原文地址 http://blog.csdn.net/ghosind/article/details/51627601 作者 ghosind 一,正则表达式过滤字符串 if (RegexString = ...
- 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项。
“/”应用程序中的服务器错误. 传入字典的模型项的类型为“System.Boolean”,但此字典需要类型“InternalCRM.EntityIACrm.Template”的模型项. 说明: 执行当 ...
- C#图片旋转
这里以Bitmap为例说明问题. 可以看到,旋转方法需要传入一个参数,而这个参数是一个枚举类型,RotateFlipType. 系统提供了两大类型的旋转, 1.旋转后不翻转. 2.旋转后接着翻转.翻转 ...
- UWP ListView嵌套ListView
要求:加载全部的订单,每个订单里面有一个或者多个产品,在列表中要展现出来, 1. xaml界面 步骤:1.这里使用的是x:bind绑定所以要引入实体类命名空间(OrderList集合中类的命名空间): ...
- FreeCL
FreeCL 1.03(Free Control Library)是一个开源且免费的Windows控件库,它属于3D图形引擎FreeGE中的一部分,用户可以自由地用于个人或商业开发.FreeCL使用类 ...
- 用 jQuery.getJSON() 跨域请求 JSON 数据
$.getJSON()可以理解为特殊形式的$.ajax(),手册里的说明好复杂,这里只记录一下用到的跨域请求. 先说在同一域名下,js发送数据到php,php返回JSON数据: $.getJSON(' ...