pyDay5
内容来自廖雪峰的官方网站
1、递归函数的优点是定义简单,逻辑清晰。
2、使用递归函数需要注意防止栈溢出。
3、在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。
4、由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。例如调用 fact(1000)会出现:
RecursionError: maximum recursion depth exceeded in comparison 递归错误:超过最大递归深度
5、解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,
所以,把循环看成是一种特殊的尾递归函数也是可以的,
原理:递归本身无论调用多少次,都只占用一个栈帧。
6、大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。
练习
汉诺塔:有三根相邻的柱子,标号为A、B、C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动,同一根柱子上都不能出现大盘子在小盘子上方。
def move(n, a, b, c):
# 递归边界
if n==1:
print(a,'-->',c)
return None
# 手下1
move(n-1, a, c, b);
# 自己动手
print(a, '-->', c);
# 手下2
move(n-1, b, a, c);
递归本身就是为了方便人脑思维的。递归的思维方式就是:某人需要完成某一件事情,只需要委托另一个人(或者几个)完成一些事情,而另一个人只需要和委托者做相同的事情,最终就可以完成这件事情。例如我需要把n个不同大小的原盘从A移动到C,最简单的方式就是:先叫手下1把n-1个圆盘移动到B(不关注他是如何移的),然后由我自己把A盘剩下的1个圆盘移动到C,最后再叫手下2把n-1个圆盘从B移动到C。至于手下1和手下2怎么完成任务,只需要和我做同样的事情就可以了。
pyDay5的更多相关文章
- 二级py--day5 软件工程基础
二级py--day5软件工程基础 软件工程基础 1.软件工程三要素:方法.工具和过程 2.软件生命周期可以分为:项目可行性研究与规划.软件需求分析.软件设计.软件实现.软件测试.软件运行与维护等阶段 ...
- 第五周 day5 python学习笔记
1.软件开发的常规目录结构 更加详细信息参考博客:http://www.cnblogs.com/alex3714/articles/5765046.html 2.python中的模块 ...
随机推荐
- thinkphp与php共享session
在其他php页面添加如下代码即可 if (!session_id()) session_start(); 使用时 thinphp 使用 session('test','123'); $user_inf ...
- HDU 3746 - Cyclic Nacklace & HDU 1358 - Period - [KMP求最小循环节]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- 希尔排序之python
希尔排序( Shell sort) 插入排序的改进版本,其核心思想是将原数据集合分割成若干个子序列,然后再对子序列分别进行直接插入排序,使子序列基本有序,最后再对全体记录进行一次直接插入排序. 我的面 ...
- iOS常用基础框架
一,简述 1.1,IOS操作系统的层次架构 iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer( ...
- YYLabel计算富文本高度-膜拜大神
http://www.jianshu.com/p/07cd655fee7e YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:C ...
- little_rockie
https://www.cnblogs.com/nxld/p/6058591.html
- pro 图层 叹号
同事遇到问题,后来他自己探索解决了~~大致记录如下 pro1.4中打开mxd,部分图层前显示叹号.根据arcmap的经验,点击叹号去修复,结果显示 不支持类型数据. 后解决办法:新建pro 的proj ...
- ARP报文
硬件类型:指明了发送方想知道的硬件接口类型,以太网的值为1: 协议类型:指明了发送方提供的高层协议类型,IP为0x0800(16进制): 硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这 ...
- LeetCode 第 342 题(Power of Four)
LeetCode 第 342 题(Power of Four) Given an integer (signed 32 bits), write a function to check whether ...
- mysql 表基本增删查改
对表的操作是在某个数据库下才能进行的,所以要先选择数据库 "use 数据库名;" 1.创建数据表 1)"create table 表名 (字段1 类型 [约束], ...