内容来自廖雪峰的官方网站

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的更多相关文章

  1. 二级py--day5 软件工程基础

    二级py--day5软件工程基础 软件工程基础 1.软件工程三要素:方法.工具和过程 2.软件生命周期可以分为:项目可行性研究与规划.软件需求分析.软件设计.软件实现.软件测试.软件运行与维护等阶段 ...

  2. 第五周 day5 python学习笔记

    1.软件开发的常规目录结构 更加详细信息参考博客:http://www.cnblogs.com/alex3714/articles/5765046.html         2.python中的模块 ...

随机推荐

  1. Linux下实现秒级定时任务的两种方案

    Linux下实现秒级定时任务的两种方案(Crontab 每秒运行): 第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command s ...

  2. bootstrap中点击左边展开

    <div id="sideNav" href=""><i class="material-icons dp48 glyphicon- ...

  3. ELK之filebate收集日志传递至Logstash

    软件版本查看(版本最好一致) 安装过程不详叙 本次使用filebeat监控nginx日志(已经配置json输出)收集并且传递给Logstash进行处理 filebeat配置文件/etc/filebea ...

  4. PAT甲1005 Spell it right【字符串】

    1005 Spell It Right (20 分) Given a non-negative integer N, your task is to compute the sum of all th ...

  5. CodeForces - 669D Little Artem and Dance 想法题 多余操作

    http://codeforces.com/problemset/problem/669/D 题意:n个数1~N围成一个圈.q个操作包括操作1:输入x, 所有数右移x.操作2:1,2位置上的数(swa ...

  6. ios-多语言版本开发(三)(转载)

    写在前面  iOS 多语言版本的开发(二)中我们实现了如何让用户自己去切换系统语言的功能,我们还写了Demo 以供辅助学习:但是,继以上两篇文章都是建立在项目刚刚启动或启动不久,项目中存在的中文字符串 ...

  7. iOS多线程编程之自定义NSOperation(转载)

    一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // ...

  8. Word文档中的格式标记大全

    在Word中有很多的格式设置,很多格式设置都会有一些标记,这些标记是隐藏的,在打印文档时是不会打印出来的,但是它们却起着结构化文档的大作用.如果你在编辑文档,不妨点击格式标记开关,看看都有哪些格式标记 ...

  9. Jungle Roads---poj1251 hdu1301

    Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid ...

  10. 洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记

    高斯消元 其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ 先港高斯消元趴? 这个算法并不难理解啊?就会矩阵运算就过去了鸭,,, 算了都专门为此写个题解还 ...