本小节的示例比较简单,因为在每次递归过程中原问题仅缩减为单个更小的问题。这样的问题往往能够用简单循环解决。这类递归算法的函数调用图是链状结构。这种递归类型被称为“单重递归”(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. mysql 8.0.18 mgr 搭建及其切换

    mysql 8.0.18 mgr 搭建及其切换 一.系统安装包 yum -y install make gcc-c++ cmake bison-devel ncurses-devel readline ...

  2. Mybaits 查询 choose when 的使用

    @Select("<script>"+ "SELECT * " + "FROM bgs_housing A" + " ...

  3. Springboot设置session超时时间

    按优先级高到低说: 第一种: spring boot 启动类里面: package com.mycenter; import org.mybatis.spring.annotation.MapperS ...

  4. 批处理(.bat)文件使用笔记

    color: 一位参数时→改变字体颜色,例如 color a 就是修改字体为亮绿色. 两位参数时→改变背景和字体颜色,第一位参数为背景颜色值,第二位参数为字体颜色值. color [BF] B:背景颜 ...

  5. ORACLE/SQL用函数进行每年,每月,每周,每日的数据汇总

    15/03/21  用函数进行每年,每月,每周,每日的数据汇总 假设一个销售明细表 sale_detail 含有 国家(country),销售时间(sale_time),销售额(sale_money) ...

  6. pycharm中调用函数方法自动补全p,m,c,v,f分别是什么意思

    p:parameter 参数m:method 方法c:class 类v:variable 变量f:function 函数

  7. R_Studio模拟学生成绩对数据简单分析

    模拟产生学生名单,记录高数,英语,网站开发三科成绩,然后进行统计分析 假设有100名学生,起始学号为161304000,各科成绩取整 高数成绩为均匀分布随机函数,都在75分以上 英语成绩为正态分布,平 ...

  8. kafka监控指标项

    监控配置 ​ kafka基本分为broker.producer.consumer三个子项,每一项的启动都需要用到 $KAFKA_HOME/bin/kafka-run-class.sh 脚本,在该脚本中 ...

  9. 「POI 2010」Bridges

    题目链接 戳我 \(Solution\) 看到"最大值最小",就知道应该要二分 二分之后,对于每个\(mid\),只要计算小于\(mid\)的边,然后在剩下的图中判断有无欧拉回路 ...

  10. Spring data redis-StringRedisTemplate 用法

    Spring-data-redis为spring-data模块中对redis的支持部分,简称为“SDR”,提供了基于jedis客户端API的高度封装以及与spring容器的整合,事实上jedis客户端 ...