递归函数属于那种“难者不会,会者不难”的事情,回想自己大学时学习递归函数的经历,简直是痛不欲生,代码里没有一行是看不懂的,但就是理解不了它是怎样运行的。 等到自己悟通了原理,就又会觉得这东西太简单了,不明白自己当初为何想不清楚。

对于递归函数,你就把握以下几点:

  1. 在函数内调用函数自身,和调用其他函数没有区别,反正都是函数
  2. 递归函数存在条件,在这个条件下必须return,否则递归就成了死循环
  3. 最后一条,也是容易出错的地方,函数多次递归调用,形成了一个多层次的调用关系,函数return 时,是从最底层开始逐层return的,return只是结束当前所在的函数

第3条是最难理解的部分,原因在于递归函数的调用是一个动态的过程,而我们看到的代码是静态的,对于刚刚接触编程的人,还不能够在阅读完代码后,仅凭对代码的逻辑的理解在头脑中模拟出程序的执行过程。

所以,我决定画一张图来解释递归函数的调用过程,我先写一个计算阶乘的递归函数

def func(n):if n == 1:return 1return n*func(n-1)print(func(5))

下图是执行func(5) 的递归调用过程

解释一下这张图里各个线条的含义:

  1. 紫色的箭头表示函数调用
  2. 橙色的箭头表示函数执行return 语句
  3. 5次func函数调用,前4次我用了浅蓝色,最后一次调用是橙色

都是函数调用,为什么最后一次用橙色呢?最后一次func调用,和前面4次是不同的,最后一次调用终止了整个递归调用,从它开始,递归调用进入到return阶段。

右侧的注释说明,很好的描述了函数的执行过程,想要计算出5的阶乘,先要计算4的阶乘,然后5乘以4的阶乘就是最终结果,计算4的阶乘需执行func(4)。计算4的阶乘时,先要计算3的阶乘,然后4乘以3的阶乘最为func(4) 的结果等和5相乘作为func(5) 的结果;计算3的阶乘呢?和前面的思路一致。

等到计算1的阶乘时,思路就变了,你必须直接return 1的阶乘,不能再调用func函数了,因为1的阶乘就是1,不能转换成1乘以某个数的阶乘。

你不可以将这段程序理解为func函数被调用了5次,有5个返回结果。尽管你的描述没有错误,但从执行程序的视角来看,作为用户,你只调用了1次func函数,那就是func(5), 剩下的那4次,是函数func自己内部进行的处理,你只得到了一个返回结果,它就是120。

换一个角度来看

  1. func(1) 的返回结果是1,给了func(2)
  2. func(2) 计算2func(1) = 21 =2 , 将2作为结果返回给func(3)
  3. func(3) 计算3func(2) = 32 =6,将6返回给func(4)
  4. func(4) 计算4func(3) = 46=24, 将24返回给func(5)
  5. func(5) 计算5func(4) = 524=120,你最终得到的就是120

函数调用是一个过程,理解递归的关键是理解递归过程中的调用链是如何形成的,调用链的最后一个环节会有一个返回值,之后整个调用链条里的节点,都根据自己下一个节点的返回值计算自己的返回值并返回给上一个节点。最顶层的节点是你调用的,你得到的就是最终的结果。

一张图学会python递归函数相关推荐

  1. 一张图了解python_一张图学会python

    提到一张图,大多数人都知道,有人问一张图学会python,当然了,还有人问python 将多个列表合并成一个,这到底是咋回事?其实python删除列表元素呢,接下来小编为大家分享一张图学会python ...

  2. 一张图学会Python

    一张图学会Python 国外一名大神设计的,国内一名大牛翻译的.

  3. 一张图学会python-一张图学会python

    一张图学会摄影(共9篇)一张图读懂摄影全是套路 论如何从零开始学摄影全是套路 论如何从零开始学摄影相信很多想要玩摄影的朋友,总会遇见各种问题,比如相机怎么选,镜头怎么配,快门是什么之类的,看似很杂乱, ...

  4. python一张图-一张图学会python

    一张图学会摄影(共9篇)一张图读懂摄影全是套路 论如何从零开始学摄影全是套路 论如何从零开始学摄影相信很多想要玩摄影的朋友,总会遇见各种问题,比如相机怎么选,镜头怎么配,快门是什么之类的,看似很杂乱, ...

  5. 一张图学会python 3_一张图学会Python?想啥呢?!

    网上有这样一张图片,信息量很大,通常会被配上标题"一张图带你学会Python" 这张图流传甚广,但我没有找到明确的出处,图片上附带了 UliPad 的作者 Limodou 的信息, ...

  6. 一张图学会python高清图-一张图带你学会Python,学习Python的非常简单,附教程

    原标题:一张图带你学会Python,学习Python的非常简单,附教程 网上有这样一张图片,信息量很大,通常会被配上标题"一张图让你学会Python" 这张图流传甚广,但我没有找到 ...

  7. 一张图学会python高清图-一张图让你学会Python

    Python是一个非常适合初学者入门的编程语言.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易.自带的各种模块加上丰富的第三方模块,免去了很多"重复造轮子"的工作,可 ...

  8. 一张图学会python应用到excel-Python | 编写一个简单的Excel处理脚本

    前段时间,温老师找我说财务处的某老师平日处理大量的Excel,很多都是机械的重复劳动,不胜其烦.和我简单说了下需求,看我能不能写个程序帮一下忙. 需求简述如下: 一个多行多列的Excel文档有一列为& ...

  9. 【转】一张图学会python编程

    网上看到一个牛人画的python学习图,非常经典,收藏!

最新文章

  1. Python3中lambda表达式介绍
  2. 微软小冰评分接口_微软小冰测颜值准不准?郑爽才得6.3分,较真你就输了
  3. windows2008下 IIS7 HTTP 错误 404.2 - Not Found 解决方法(图文)
  4. 简单子串查找--strstr的使用(ZCMU1108)
  5. 标准h5的定位_不但亲民还安全 红旗H5车门/防撞梁拆解
  6. 收藏!示波器探头的选择与使用
  7. 图片放大镜 jQuery插件
  8. 【UCOSIII操作系统】硬件初始化篇(1)硬件初始化以及开始运行系统
  9. 详解AI加速器:为什么说现在是AI加速器的黄金时代?
  10. 萤石云视频监控电脑版 v2.6.11.0官方版
  11. 小白必读:计算机网络入门
  12. SLAM在机器人中的应用
  13. CAD中的选择集过滤----DXFCode(一)
  14. 全网最便宜的OpenHarmony开发板和模组Neptune问世(基于联盛德W800的SoC),9.9元带蓝牙和wifi功能还包邮
  15. 06年注册安全工程师试题
  16. 情人节买什么礼物比较好呢?最实用的情人节礼物分享
  17. 浙大计算机科学与技术专业分数线,浙江大学数学系分数线
  18. 2020-12-16实现键盘控制,自动追击的猫抓老鼠小游戏
  19. 计算机游戏教学法.ppt,计算机游戏教学法第十一章.ppt
  20. 密室价目菜单设计 密室逃脱

热门文章

  1. 风险类型说明和处理建议手册
  2. 关于游戏 生死狙击 辅助 外挂 这种
  3. FileUpload解析
  4. GridView分页的实现
  5. WPF控件开发之自定义控件(3)
  6. 天意u盘启动盘安装linux,(BIOS+UEFI双启WINPE)天意u盘维护系统技术员版V2.1
  7. python正则表达式\d 匹配数字\D 匹配非数字\w 匹配单词\W 匹配非单词字符
  8. python网络爬虫-爬取《斗破苍穹》全文小说 源码
  9. 【PA2015】【BZOJ4296】Mistrzostwa
  10. 在SpringBoot项目中使用Ureport2报表工具