递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函

数。(1) 递归就是在过程或函数里调用自身。(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

递归一般用于解决三类问题:

(1)数据的定义是按递归定义的。(n的阶乘)

(2)问题解法按递归实现。(回溯)

(3)数据的结构形式是按递归定义的。(二叉树的遍历,图的搜索)

递归的缺点:

递归解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,因此递归次数过多容易造成栈溢出。

#递归函数  act(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x ndef fact(n):if n==1:return 1return n*fact(n-1)

尾递归是指,在函数返回的时候,调用自身本身,并且,return 语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

上面的fact(n)函数由于return n * fact(n ‐ 1)引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:

#定义尾递归函数def fact(n):return  fact_iter(n,1)def fact_iter(num,product):if num ==1:return productreturn fact_iter(num-1,num*product)#测试print fact_iter(5,1)120可以看到,return fact_iter(num ‐ 1, num * product)仅返回递归函数本身,num ‐ 1 和num * product 在函数调用前就会被计算,不影响函数调用。fact(5)对应的fact_iter(5, 1)的调用如下: '''#实现过程解读===> fact_iter(5, 1)===> fact_iter(4, 5)===> fact_iter(3, 20)===> fact_iter(2, 60)===> fact_iter(1, 120)===> 120'''

尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。遗憾的是,大多数编程语言没有针对尾递归做优化,Python 解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

小结

使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。

针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循

环语句的编程语言只能通过尾递归实现循环。

python递归和循环的区别_递归与伪递归区别,Python 实现递归与尾递归相关推荐

  1. python中for循环语句格式_关于Python中的for循环控制语句

    #第一个:求 50 - 100 之间的质数 import math for i in range(50, 100 + 1): for j in range(2, int(math.sqrt(i)) + ...

  2. python中 和 的区别_举例子让你明白python中is和==的区别

    在说 is 和 == 的区别之前,我们先理解下python的变量.python的变量和java的变量有很大的区别,因为一个是动态语言,另一个是静态语言. java的变量就像是个盒子,是把对象的地址装进 ...

  3. python 循环控制语句结束_孤荷凌寒自学python第十五天python循环控制语句

    python中只有两种循环控制语句 一.while循环 while 条件判断式 1: 如果 条件判断式1 返回True 将执行此代码块的内容 而且此代码块的内容执行完成后 将重新判断条件判断式1 co ...

  4. python双重for循环怎么理解_理解 Python 的 for 循环

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在本篇博客中,我们将讨论 Python 中 for 循环的原理. 我们将从一组基本例子和它的语法开始,还将 ...

  5. python命令行模式和交互模式区别_对命令行模式与python交互模式介绍

    命令行模式与python交互模式 1.在命令行模式下,可以执行 python 进入 Python 交互式环境,也可以执 行 python hello.py 运行一个.py 文件. 2.在 Python ...

  6. python 实例方法和类方法的区别_实例方法和类方法的区别 python

    展开全部 有区别的,最主要的区别在于,定32313133353236313431303231363533e58685e5aeb931333363363433义类方法主要是要加一个装饰器,@classm ...

  7. python函数使用易错点_大部分人都会忽略的Python易错点总结

    python中复数实现(-2) ** 0.5和开根号sqrt(-2)的区别 (-2)**0.5和sqrt(-2)是不同的,前者是复数后者是会报错的. print((-2)**0.5) #输出:(8.6 ...

  8. python从键盘输入列表有缺陷_程序员必知的Python陷阱与缺陷列表-阿里云开发者社区...

    代码看起来可以工作,但不是以你"想当然""的方式.如果一段代码直接出错,抛出了异常,我不认为这是陷阱.比如,Python程序员应该都遇到过的"UnboundLo ...

  9. 我们编写的python代码在运行过程中_在Rust代码中编写Python是种怎样的体验?

    原标题:在Rust代码中编写Python是种怎样的体验? 作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前 ...

  10. python是人都能学会_人人都能学会的python编程教程15:高级特性2

    生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题 ...

最新文章

  1. 开发日记-20190602 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  2. LeetCode-208 Implement Trie (Prefix Tree)
  3. Codeforces 436D Pudding Monsters
  4. 端口镜像在网络安全中的应用
  5. 网站访问数据统计工具
  6. 影视解说短视频如何吸引粉丝?三个要点助你吸粉引流
  7. 【Python】QQ大家来找茬辅助
  8. DNk开发步骤与环境配置
  9. hp打印机一直显示正在打印中_打印机显示正在打印却没反应 - 卡饭网
  10. 桌面计算机地址栏在哪,电脑窗口地址栏清理
  11. MMC子系统调用过程浅析(Core层)
  12. Flutter开发之——Icon图标
  13. 井字棋TicTacToe_01
  14. 感知复合型人才的重要性!
  15. linux操作系统使用广泛吗,为何说Ubuntu是使用最广泛Linux操作系统的五大理由
  16. Linux为fluent配置环境变量,Ubuntu 9.10下安装Fluent lnx86-6.3.26成功
  17. 替代Xshell的良心国产SSH工具软件
  18. linux pcm和alsa 区别,linux alsa pcm(此pcm非硬件pcm接口)
  19. linux LAMP的作用和现状,lamp简介
  20. 以智慧城市为标杆打造立体防控,咫尺之间华丽转身

热门文章

  1. SQL – 2.SQLServer的管理 + 3.SQL基础1 + 4.SQL基础2
  2. 网管日志-06.07.24
  3. 培训时常犯的学习误区与应对方法
  4. 2021-02-03-延长一天时间的有效方法
  5. PMO在组织结构中的作用
  6. ER图转换成关系模式集的规则
  7. 解决win10安卓虚拟机每十几分钟蓝屏重启问题
  8. ruby 生成哈希值_哈希 Ruby中的运算符
  9. xml分析错误:注释未终止_错误:C中的未终止注释(无效的注释块) 常见的C程序错误...
  10. 职称计算机提前考试试卷,职称计算机考试多项选择考试卷模拟考^试题