本小节的示例比较简单,因为在每次递归过程中原问题仅缩减为单个更小的问题。这样的问题往往能够用简单循环解决。这类递归算法的函数调用图是链状结构。这种递归类型被称为“单重递归”(single recursion)。

示例一:编写函数seq(n),打印从1到n的数字。

可以很容易地用循环解决这个问题:

def seq(n):
i = 1
while i<=n:
print(i)
i += 1

也可以使用递归版本,这是本节的主要程序风格:

def seq(n):
if n>0:
seq(n-1)
print(n)

在递归版本的seq()函数中,参数等于0时函数什么也不做直接返回。当参数为正整数时[1],将参数减1后调用自身,待调用返回后打印参数。当调用seq(3)时,该函数会生成如下的调用链seq(3) > seq(2) > seq(1) > seq(0),当调用链依次返回时,seq(3) - seq(1)的print语句会逆序执行,完成打印序列的目的。如图 2.10所示。 

图 2.10 seq函数的递归调用次序

图 2.11 seq的调用栈变化示意图

在实际编写代码时,不会使用这样的方式打印序列[2]。因为对于本问题来说,递归版本的效率很低。本小节示例的目的是让读者了解递归函数的执行流程和基本语法形式。

[1] 为了简单起见,假定函数只会接收到非负整数作为参数。

[2] 据传这是世纪之交某跨国大型IT企业的应届生招聘试题。原题是“编写函数,不使用局部变量打印1到n”。当时的很多毕业生对此束手无策。从这个角度上该问题的递归版本还是有意义的。时至今日这已是平常技巧,已不常见于企业面试题。

这是一本很有趣很有趣的Python入门书,墙裂推荐。

《Python编程从0到1》笔记5——图解递归你肯定看完就能懂!的更多相关文章

  1. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  2. Python编程从入门到实践笔记——类

    Python编程从入门到实践笔记——类 #coding=gbk #Python编程从入门到实践笔记——类 #9.1创建和使用类 #1.创建Dog类 class Dog():#类名首字母大写 " ...

  3. Python编程从入门到实践笔记——字典

    Python编程从入门到实践笔记——字典 #coding=utf-8 #字典--放在{}中的键值对:跟json很像 #键和值之间用:分隔:键值对之间用,分隔 alien_0 = {'color':'g ...

  4. Python编程从入门到实践笔记——操作列表

    Python编程从入门到实践笔记——操作列表 #coding=utf-8 magicians = ['alice','david','carolina'] #遍历整个列表 for magician i ...

  5. Python编程从入门到实践笔记——列表简介

    Python编程从入门到实践笔记——列表简介 #coding=utf-8 #列表——我的理解等于C语言和Java中的数组 bicycles = ["trek","cann ...

  6. Python编程从入门到实践笔记——变量和简单数据类型

    Python编程从入门到实践笔记——变量和简单数据类型 #coding=gbk #变量 message_1 = 'aAa fff' message_2 = 'hart' message_3 = &qu ...

  7. Python编程从入门到实践笔记——文件

    Python编程从入门到实践笔记——文件 #coding=gbk #Python编程从入门到实践笔记——文件 #10.1从文件中读取数据 #1.读取整个文件 file_name = 'pi_digit ...

  8. Python编程从入门到实践笔记——函数

    Python编程从入门到实践笔记——函数 #coding=gbk #Python编程从入门到实践笔记——函数 #8.1定义函数 def 函数名(形参): # [缩进]注释+函数体 #1.向函数传递信息 ...

  9. Python编程从入门到实践笔记——用户输入和while循环

    Python编程从入门到实践笔记——用户输入和while循环 #coding=utf-8 #函数input()让程序暂停运行,等待用户输入一些文本.得到用户的输入以后将其存储在一个变量中,方便后续使用 ...

随机推荐

  1. 使用vue写扫雷游戏

    上班闲来没事做,,心血来潮.想用刚学的vue,写一个扫雷游戏..好了,直入正题. 第一步,先制作一个10x10的格子图..这个divcss就不说了..大家都会. 第二步,制造一个数组,用来生成随机雷区 ...

  2. c3p0连接池:com.mysql.cj.exceptions.InvalidConnectionAttributeException

    1 遇到的错误com.mysql.cj.exceptions.InvalidConnectionAttributeException: 四月 17, 2019 10:21:13 上午 com.mcha ...

  3. vue设置全局query参数

    router.beforeEach((to, from, next) => { // 设置全局店铺ID shopid const shopid = from.query.shopid // 如果 ...

  4. 什么是Web Service(Web服务)?

    从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API.例如可以创建一个提供天气预报的Web Service,那么无论你用哪种编程语言开发的应用都可以通过 ...

  5. easyui 动态添加组件 要重新渲染

    做项目时动态添加组件是常有的事,easyui动态添加组件时样式会失效,这是因为这个组件没有经过 easyui的解析器解析, 比如:   <pre name="code" cl ...

  6. 51 Nod 1086 多重背包问题(二进制优化)

    1086 背包问题 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放 ...

  7. POJ 2456 编程技巧之------二分查找思想的巧妙应用

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18599   Accepted: 8841 ...

  8. mysql 链接数满了的错误 ERROR 1040 (HY000): Too many connections

    mysql 链接数满了的错误 ERROR 1040 (HY000): Too many connections 第一种处理方式: ./mysql -u root -p 登录成功后执行以下语句查询当前的 ...

  9. mongo注解详解

    1.@Entity如果你想通过Morphia把你的对象保存到Mongo中,你首先要做的是使用@Entity注解你的类:@Entity(value="comm_user_favorite_co ...

  10. MQTT消息中间件Mosquitto的安装和配置

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...