当前位置: 首页 > news >正文

python全栈开发从入门到放弃之递归函数的调用

1.递归效率低,需要在进入下一次递归时保留当前的状态,见51cto博客

解决方法是尾递归,即在函数的最后一步(而非最后一行)调用自动
但是python又没有尾递归,且对递归层级做了限制

必须有一个明确的结束条件

2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种)
尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

 什么叫递归:

递归函数,在一个函数内调用自己
最大递归层数做了一个限制:997

最大层数限制是python默认的,可以做修改

但是不建议修改因为会占用电脑的内存

#猜alex的年龄
#alex比egon大两岁 alex = egon + 2
#egon比wuSir大两岁 egon = wusir + 2
#wusir比nezha大两岁 wusir = nezha + 2
#nezha比金鑫大两岁 金鑫 + 2
#金鑫40了

# 1.金鑫 age(1) = 40
# 2.哪吒 age(1) + 2
# 3.wusir age(2) + 2
# 4.egon age(3) + 2
# 5.alex age(4) + 2

 1 def age(n):
 2     if n == 1:
 3         return 40     
 4     else:
 5         ret = age(n-1)   #先递推后递归 
 6         return ret + 2
 7 ret=age(5)
 8 print(ret)
 9 
10 48
#结束递归的标志:return

递归实现三级菜单

 1 menu = {
 2     '北京': {
 3         '海淀': {
 4             '五道口': {
 5                 'soho': {},
 6                 '网易': {},
 7                 'google': {}
 8             },
 9             '中关村': {
10                 '爱奇艺': {},
11                 '汽车之家': {},
12                 'youku': {},
13             },
14             '上地': {
15                 '百度': {},
16             },
17         },
18         '昌平': {
19             '沙河': {
20                 '老男孩': {},
21                 '北航': {},
22             },
23             '天通苑': {},
24             '回龙观': {},
25         },
26         '朝阳': {},
27         '东城': {},
28     },
29     '上海': {
30         '闵行': {
31             "人民广场": {
32                 '炸鸡店': {}
33             }
34         },
35         '闸北': {
36             '火车战': {
37                 '携程': {}
38             }
39         },
40         '浦东': {},
41     },
42     '山东': {},
43 }
44 
45 
46 def threeLM(menu):
47     for i in menu:
48         print(i)
49     key = input("please input name:")
50     if key in menu:
51         threeLM(menu[key])
52 
53 
54 
55 threeLM(menu)

递归二分算法

 1 如果一个数 可以整除2 就整除
 2 不能整除就*3+1
 3 def func(num):
 4     print(num)
 5     if num == 1:
 6         return
 7     if num %2 == 0:
 8         num = num //2
 9     else:
10         num = num * 3 + 1
11     func(num)
12 
13 func(5)
14 
15 输出结果:
 1 l = [2,3,5,10,15,16,18,22,26]
 2 def find(l,aim): #l:列表 aim:要找的
 3     mid = len(l)//2  #计算中点
 4     if l[mid] > aim: #判断中间位置的值和目标值的大小关系
 5         new_l = l[:mid] #[16,18] = [16,18,22,26][:mid]
 6         return find(new_l,aim)
 7     elif l[mid] < aim:#判断中间位置的值和目标值的大小关系
 8         new_l = l[mid+1:]
 9         return find(new_l,aim)
10     else:
11         return l[mid]
12 print(find(l,16))
13 
14 
15 16

 

转载于:https://www.cnblogs.com/zcfx/p/7265432.html

相关文章:

  • 选好网络管理工具 “0掉线”也并非不可能
  • 大数据市场蕴含万亿级别巨大商机
  • HBase – Memstore Flush深度解析
  • 什么是工程师文化?
  • 大数据将颠覆润滑管理模式
  • 重磅!2017大数据十大趋势
  • 高效数据中心网络管理五大技巧
  • 首席数据官如何养成?
  • Composer 更换为国内镜像源(Packagist 镜像)
  • EMC全面入驻戴尔:我的行李该往哪儿放?
  • 大神们最近都在读这些论文 | 本周值得读 #44
  • 9.12測试(四)——測试笔
  • 逐个击破关于云计算的十个讹传
  • 《MonoTouch开发实践指南》一3.3 为视图控制器及其视图添加功能
  • 【Android】RxJava之初始篇
  • 【技术性】Search知识
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular2开发踩坑系列-生产环境编译
  • CentOS7 安装JDK
  • echarts的各种常用效果展示
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Git学习与使用心得(1)—— 初始化
  • javascript数组去重/查找/插入/删除
  • jquery ajax学习笔记
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PermissionScope Swift4 兼容问题
  • python_bomb----数据类型总结
  • Vue官网教程学习过程中值得记录的一些事情
  • vue--为什么data属性必须是一个函数
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 检测对象或数组
  • 前端工程化(Gulp、Webpack)-webpack
  • 学习使用ExpressJS 4.0中的新Router
  • 再谈express与koa的对比
  • 字符串匹配基础上
  • const的用法,特别是用在函数前面与后面的区别
  • scrapy中间件源码分析及常用中间件大全
  • Spring Batch JSON 支持
  • 阿里云API、SDK和CLI应用实践方案
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define,static,const,三种常量的区别
  • #QT项目实战(天气预报)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (13)Hive调优——动态分区导致的小文件问题
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十)c52学习之旅-定时器实验
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (五)Python 垃圾回收机制
  • .stream().map与.stream().flatMap的使用
  • /boot 内存空间不够
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @angular/cli项目构建--http(2)