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中的模块 ...
随机推荐
- 2018上C语言程序设计(高级)作业- 第4次作业
作业要求一 1.设计思路: 第一步:首先通过cmd进行判断 第二步:根据题目写的分别进入不同的判断函数,进行逐一判断: 2.实验代码: #include <stdio.h> #includ ...
- HDU-1881 毕业bg (01背包变形)
毕业bg Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
- TOP100summit 2017:亚马逊Echo音箱能够语音识人,华人工程师揭秘设计原理
本文编辑:Cynthia 2017年,人工智能的消费产品落地聚焦在了智能音箱上,谷歌.亚马逊纷纷推出智能音箱产品,国内的阿里巴巴推出天猫精灵,小米推出小米AI音箱.智能音箱通过语音可以发出指令,未 ...
- numpy的文件存储,读取 .npy .npz 文件
Numpy能够读写磁盘上的文本数据或二进制数据. 将数组以二进制格式保存到磁盘 np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 ...
- import tkinter与from tkinter import *的区别
from tkinter import * class DirList(object): def __init__(self,initdir=None): self.top= Tk() ##可以不加t ...
- address sizes : 46 bits physical, 48 bits virtual
processor : 7vendor_id : GenuineIntelcpu family : 6model : 63model name : Intel(R) Xeon(R) CPU E5-26 ...
- kafka配置文件注解
若advertised.host.name的值是aa,则kafka发布的服务名也要是aa kafka log.cleanup.policy=delete 日志清理策略 log.retention.ho ...
- MySQL5.6命令笔记
授权root用户在远程终端访问 ' WITH GRANT OPTION;
- 常用的windows注册表大全
目录 使系统没有“运行”选项 1让操作系统无“关闭系统” 选项 2让操作系统无“注销”选项 ...
- ConcurrentLinkedQueue
我们要实现一个线程安全的队列有两种实现方式,阻塞算法.非阻塞算法.使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁) 或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环 ...