一张图学会python递归函数

这篇具有很好参考价值的文章主要介绍了一张图学会python递归函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

print(func(5))

下图是执行func(5) 的递归调用过程
一张图学会python递归函数
解释一下这张图里各个线条的含义:

  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

函数调用是一个过程,理解递归的关键是理解递归过程中的调用链是如何形成的,调用链的最后一个环节会有一个返回值,之后整个调用链条里的节点,都根据自己下一个节点的返回值计算自己的返回值并返回给上一个节点。最顶层的节点是你调用的,你得到的就是最终的结果。文章来源地址https://www.toymoban.com/news/detail-408897.html

到了这里,关于一张图学会python递归函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一张图搞懂微服务架构设计

    当前,微服务架构在很多公司都已经落地实施了,下面用一张图简要概述下微服务架构设计中常用组件。不能说已经使用微服务好几年了,结果对微服务架构没有一个整体的认知,一个只懂搬砖的程序员不是一个好码农! 在上图中可以看到,Nginx作为整个架构的流量入口,可以

    2023年04月17日
    浏览(52)
  • 一张图快速了解 Istio 的 EnvoyFilter

    EnvoyFilter 提供了一种机制来定制 Istio Pilot 生成的 Envoy 配置。使用 EnvoyFilter 修改某些字段的值,添加特定的过滤器,甚至添加全新的侦听器、集群等等。 这个功能必须谨慎使用,因为不正确的配置可能会破坏整个网格的稳定性。与其他 Istio 网络对象不同,EnvoyFilter 是叠加应

    2024年02月08日
    浏览(48)
  • uniapp:手写签名,多张图合成一张图

    要实现的内容 :手写签名,协议内容。点击提交后:生成1张图片,有协议内容和签署日期和签署人。 实现的效果图如下: 1、签名页面

    2024年02月15日
    浏览(89)
  • GLES学习笔记---立方体贴图(一张图)

    立方体贴图 如上图是一张2D纹理,我们需要将这个2D纹理贴到立方体上,立方体有6个面,所以上面的2D图分成了6个面,共有14个纹理坐标 上边的立方体一共8个顶点坐标,范围是[-1, 1]; 我们要做的是将纹理图贴到这6个面上面 我们绘制的时候使用了VBO、VAO、EBO、 indices里面是绘

    2024年01月19日
    浏览(53)
  • 一张图读懂TuGraph Analytics开源技术架构

    TuGraph Analytics(内部项目名GeaFlow) 是蚂蚁集团开源的分布式实时图计算引擎,即流式图计算。通过SQL+GQL融合分析语言对表模型和图模型进行统一处理,实现了流、批、图一体化计算,并支持了Exactly Once语义、高可用以及一站式图研发平台等生产化能力。 开源项目代码目前托

    2024年02月12日
    浏览(49)
  • 网络安全——一张图看懂HTTPS建立过程

    · 准备工作(对应图中prepare1234) · 发起链接 · 最后 关于网络安全加密的介绍可以看之前文章: (数据的加密与签名) HTTPS建立过程相当复杂,下图为示意图,可以有整体认识,一般我们编程知道这些已足够。 如果你想仿照HTTPS实现类似加密,可以阅读下具体过程,作为参

    2024年04月12日
    浏览(45)
  • Unity 如何通过2D Sprite切割一张图为多张

    1、理解 在一些2D游戏开发中,我们常常使用2D Sprite把一张大图切割成多个小图使用。 这样做有不少好处,首先,通过精准使用小图,能够一定程度上节省内存,提高渲染性能。 其次把同类的小图做成一张大图在切割使用会更方便我们进行对资源的管理。 再者,在2D游戏中通

    2024年04月26日
    浏览(46)
  • 一张图让你理解 IaaS、SaaS 和 PaaS 的区别?

    大家看下面这张图,我将从概念,服务,公司和发展,4 个方面,给大家通俗的解释下,什么是:SaaS,PaaS 和 IaaS:  SaaS,Paas,IaaS 的区别 互联网发展到今天,人类已经无法离开互联网而存在,我们日常会用到的微信,抖音,淘宝等,都是面向个人用户的,打开就可以立即使

    2023年04月21日
    浏览(47)
  • 【uniapp小程序-生成二维码+多个图片文字合并一张图】

    下载uqrcodejs: https://uqrcode.cn/doc/guide/getting-started.html

    2024年02月03日
    浏览(59)
  • iOS 分别对一张图的局部进行磨砂,拼接起来不能贴合

    效果图 需求,由于视图层级的原因,需要对图片分开进行磨砂, 然后组合在一起 如图,上下两部分,上下两个UIImageVIew大小相同,都是和图片同样的大小,只是上面的UIimageVIew 只展示上半部份 (上面图片的父视图cliptobound=YES,超出部分被切掉),下面的UIImageView只展示下半部

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包