我们在前面的章节中,很多次的看到了在函数中调用别的函数的情况,如果一个函数在内部调用了自身,这个函数就被称为递归函数。

高斯求和

def sum_number(n):    total = 0    for i in range(1, n+1):        total += i    return total

sum = sum_number(100)print(sum)

但如果使用递归函数来写

def sum_number(n):    if n <= 0:        return 0    return n+sum_number(n-1)

sum = sum_number(100)print(sum)

分析一下代码

当n小于0的时候,直接给出和值为0,当n大于0时,结果是n加上sum_number(n-1)。这里的sum_number(n-1)又是一次sum_number函数的调用,不过参数的值变成了n-1,要得到sum_number(n)的值必须等待sum_number(n-1)的值被计算出来,同样要得到sum_number(n-1)的值必须等待sum_number(n-2)的值,如此一路推算下去,直到sum_number(0),因为if语句的存在,它不需要等待sum_number(-1)的计算了,而是直接给出结果0。然后程序一路返回,直到回到最初的sum_number(n),并给出最终结果。

核心思想

每一次递归,整体问题都要比原来减小,并且递归到一定层次时,要能直接给出结果。

每一个递归程序都要遵循相同的基本步骤:

  • 初始化算法,递归程序通常需要一个开始时使用的种子值,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值;
  • 检查要处理的当前值是否已经与基本条件相匹配,如果匹配,则进行处理并返回值;
  • 使用更小的或更简单的子问题(或多个子问题)来重新定义答案;
  • 对子问题运行算法;
  • 将结果合并入答案的表达式;
  • 返回结果。

例如:

lis = []all_top_comments = ["顶级评论1", "顶级评论2", "顶级评论3", "..."]

def get_comment(comments):    for comment in comments:        lis.append(comment)        # 假设有一个child方法获取当前评论的所有子评论        child_comments = comment.child()        # 如果有子评论的话,就递归查找下去,否则回退        if len(child_comments) > 0:            get_comment(child_comments)

get_comment(all_top_comments)

使用递归函数需要注意递归深度溢出,在Python中,通常情况下,这个深度是1000层,超过将抛出异常。在计算机中,函数递归调用是通过栈(stack)这种数据结构实现的,每当进入一个递归时,栈就会加一层,每当函数返回一层,栈就会减一层。由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出。

可能存在无限递归_Python之递归函数相关推荐

  1. python函数的嵌套和递归_Python通过递归函数输出嵌套列表元素

    1.先用 for 循环取 for item in l: if isinstance(item ,list): for newitem in item: print(newitem) else: pri ...

  2. python setattr无限递归_python – 如何正确使用__setattr__,避免无限递归

    我想定义一个包含读写方法的类,可以调用如下: instance.read instance.write instance.device.read instance.device.write 为了不使用 ...

  3. 彻底理解python递归_Python开发之-Python递归图示理解

    1.函数递归是函数式编程的重要组成部分,所以对函数递归的深层次理解十分重要.本人用图示的方法解释函数的层级递归方式,先理解下面的函数 deftest(n):if n == 1:return 1 els ...

  4. C语言丨函数的递归调用和递归函数

    目录 前言 一.从阶乘引入 二.递归模板 1.递归函数模板 2.举例分析 三.从数学归纳法理解递归 四.更多递归实例 1.用递归方法编程计算Fibonacci数列 题目分析 程序 2.汉诺塔(Hano ...

  5. C语言无限递归和尚,递归——强大的解决问题之道

    原标题:递归--强大的解决问题之道 作者:董成荣 来源:牛客网 递 归 什么是递归? 递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词 ...

  6. python冒泡排序算法非递归_python 冒泡排序,递归

    今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,1 ...

  7. 可能存在无限递归_做事永远无头无尾?人生中的递归现象

    不知道大家有没有发现,在自己身边的人或者说就是自己,无论在职场还是学习中,有时候会陷入一种瞎忙碌的状态, 在周围的人看来你很忙碌,但是一旦需要拿出成果的时候,却又显得不尽人意,而最近的我就陷入了这样一 ...

  8. 无限“递归”的python程序

    如果一个函数直接或者间接调用了自己,那么就形成了递归(recursion),比如斐波那契数列的一个实现 def fib(n):if n <= 2:return 1else:return fib( ...

  9. Python maximum recursion depth exceeded while calling a Python object (gevent的SSL无限递归错误)的问题解决

    报错信息 源码位置 分析 很尴尬,完全看不出原因导致这个报错 解决方法 通过删除代码的方式一部一部删除,找到了问题出处 原因是包的顺序出现了问题,把位置互换一下,发现没有报错了,但是很明确的告诉你这两 ...

最新文章

  1. mysql 换行_教你如何用Python 连接 MySQL
  2. 机器学习速成课程 | 练习 | Google Development——编程练习:使用神经网络对手写数字进行分类
  3. NAS+CNN+Transformer=ViT-Res!MIT团队重磅开源ViT-Res,精度高于DeiT-Ti8.6%
  4. Python小技巧:使用*解包和itertools.product()求笛卡尔积(转)
  5. 李开复:多次失败后,我总结出最优秀创业者的4个特点
  6. RIFF和WAVE音频文件格式
  7. 容器技术Docker K8s 27 容器服务ACK基础与进阶-监控管理
  8. 河南科技学院计算机专业是几本,河南科技学院是几本
  9. iTunes只能装C盘吗_就这一篇:教你真正有效地解决爆满的C盘!
  10. vb读取mysql数据库数据_VB读取ORACLE数据库的两种方法
  11. java开发自学手册 pdf_Java项目开发实例自学手册 PDF_IT教程网
  12. 云课堂计算机教师,校校云课堂教师端
  13. 数字化转型— 华为业务流程模型学习
  14. ADAS/AD控制器模块开发13 - Feature开发之LDWLKA
  15. 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 2月17日
  16. 几种常见树形数据结构小结
  17. Scrapy框架的使用之Scrapy入门
  18. Unity3D 摄像机滑动跟随
  19. N9344C安捷伦频谱分析仪
  20. 索尼前CEO平井一夫宣布6月退休 卸任董事长并退出董事会

热门文章

  1. 【采访】腾讯社交广告高校算法大赛第三周周冠军——到底对不队比赛经验及心得分享
  2. 业界分享 | 百度图神经网络实践
  3. Embedding 技术在推荐系统中的应用实践
  4. influxdb java api使用_java使用influxDB数据库的详细源码
  5. 漫谈广告竞价模式(一)
  6. 魔兽世界python脚本拍卖行_Python大法之告别脚本小子系列—信息资产收集类脚本编写(上)...
  7. python爬虫语言都能干什么_python除了爬虫还可以做什么
  8. python用户界面画图_通过海龟绘图学习Python-01
  9. linux能运行安卓模拟器吗,Ubuntu 14.04中使用模拟器运行Android系统
  10. 若依(RuoYi)如何不登录直接访问?