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

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. jqueryui和easyui区别

    jQuery自带的一个可选UI库,但是非常可惜,一些关键的组件没有包含进去,如TreeView, DataGrid,还需要寻找第三方的插件. EasyUI是某公司开发的一套对私免费,对公收费的UI库, ...

  2. 求全排列Permutation

    是在教材(<计算机算法设计与分析(第4版)>王晓东 编著)上看见的关于求全排列的算法: 我们可以看一下书上怎么写的: #include<bits/stdc++.h> using ...

  3. python 关于GUI的思考(转)

    作者:知乎用户链接:https://www.zhihu.com/question/19721063/answer/21311275来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  4. tcpdump抓包二进制tcp协议详细分析

    1.tcpdump -i eth0 port 11751 and src host 192.168.1.34 -x -s0 tcpdump: verbose output suppressed, us ...

  5. pyobjc-framework-Cocoa 5.1.2

    Introduction — PyObjC - the Python to Objective-C bridge https://pyobjc.readthedocs.io/en/latest/ py ...

  6. 优云软件助阵ArchSummit全球架构师峰会

    由极客邦科技与 InfoQ 中国主办的 ArchSummit 全球架构师峰会深圳站,于 7 月 7 日 - 8 日在深圳华侨城洲际酒店举办. 本次大会特邀 100 多位国内外技术专家,与1000余名技 ...

  7. 【python-opencv】对象测量

    opencv 中轮廓特征包括: 如面积,周长,质心,边界框等 *弧长与面积测量 *多边形拟合 *获取轮廓的多边形拟合结果 python-opencv API提供方法: cv2.moments()用来计 ...

  8. js屏蔽f12键

    <script>            $(document).keydown(function(e) {                 if (e.keyCode == 123) {/ ...

  9. 看懂Oracle执行计划、表连接方式

    看懂Oracle执行计划  原文:https://www.cnblogs.com/Dreamer-1/p/6076440.html 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也 ...

  10. sql批量修改wordpress网站的文章发布状态

    wordpress批量导入文章的时候,有些文章的状态可能会缺失,例如“mis scheduled”.draft.future等几种状态,如何用sql批量修改wordpress网站的文章发布状态呢? 点 ...