如果一个函数在内部调用自己,那么这个函数就是递归函数。

例如一个阶乘函数:fact(n)=n! ,其实可以写成 fact(n)=n x fact(n-1)。

fact(n) 以递归的方式可以表示为:

def fact(n):

if n==1:

return 1

return n*fact(n-1)

递归函数容易引起栈溢出。在计算机中,函数调用是通过堆栈实现的。每进入一个函数调用,堆栈会增加一层栈帧;每次函数返回,栈帧会减少一层。由于堆栈大小不是无限的,所以递归调用次数过多会导致栈溢出。可以试试 fact(1000)。

此问题可以通过尾递归优化。

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

事实上,尾递归和循环的效果是一样的,所以可以把循环堪称是一种特殊的尾递归函数。

上面的函数修改如下:

def fact(n):

return fact_iter(n,1)

def fact_iter(num, product):

if num==1:

return product

return fact_iter(num-1, num*product)

此时,return仅返回递归函数本身,num-1和num*product在函数调用前就会被计算,不影响函数调用。

python: 函数递归与尾递归的更多相关文章

  1. python 函数递归

    ##recursive递归 递归特性:1. 必须有一个明确的结束条件2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通 ...

  2. python 函数递归与匿名函数

    1.什么是函数递归? 函数递归调用(是一种特殊的嵌套调用):在调用的函数过程中,又直接或者间接的调用了该函数本身 递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调每进入下一层递归问题的规 ...

  3. Python 函数递归-三元表达式-列表生成式-字典生成式-匿名函数-内置函数

    上节课复习: 1. 无参装饰器 def 装饰器名字(func): def wrapper(*args,**kwargs): res = func(*args,**kwargs) return res ...

  4. python函数递归和生成器

    一.什么是递归 如果函数包含了对其自身的调用,该函数就是递归的.递归做为一种算法在程序设计语言中广泛应用,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的 ...

  5. Python函数递归调用

    函数的递归调用: 是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或间接地调用到了本身 # 直接调用本身 def func(): print('我是func') func() f ...

  6. day15 Python函数递归,轻易不要用递归,容易搞出来内存溢出

    古之欲明明德于天下者,先治其国:欲治其国者,先齐其家:欲齐其家者,先修其身:欲修其身者,先正其心:欲正其心者,先诚其意:欲诚其意者,先致其知,致知在格物.物格而后知至,知至而后意诚,意诚而后心正,心正 ...

  7. py-day3-2 python 函数递归

    # 递归 def calc(n): print(n) if int(n/2) == 0: return n res = calc(int(n/2)) return res res = calc(10) ...

  8. python学习三十五天函数递归的用法

    python函数递归就是自己调用自己,无限循环,但是python限制了调用的次数1000次,就会终止,递归用在栏目分类,采集程序比较多,下面简单说函数递归用法和实例 1,函数递归用法 def func ...

  9. Python的递归

    递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...

随机推荐

  1. Hexo使用攻略-添加分类及标签

    创建"分类"选项 生成"分类"页并添加tpye属性 打开命令行,进入博客所在文件夹.执行命令 hexo new page categories 成功后会提示: ...

  2. VMware中 CentOS7挂载windows共享文件夹

    在编译自己的hadoop时,不想再次在虚拟机中下载jar包,就想到了挂载自己本地的maven仓库,使用本地仓库来进行编译,这里就需要使用VMware的VMware Tools了,直接复制官方文档如下 ...

  3. spring的组成模块

    spring的核心组件(骨骼架构)——   共同创建了Bean关系网络 Core:主要定义了资源的访问方式 Context:给spring提供一个运行时的环境 Bean:Bean的定义,创建以及解析 ...

  4. IPv4 IPv6

    IP提供了一种best-effort,connection-less数据delivery服务. best-efforty意味着它不保证IP数据段会成功到达目的地.当error发生时,IP通常选择丢弃d ...

  5. ajax 工作原理

    Ajax的优缺点及工作原理? 定义和用法: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).Ajax 是一种用于创建快速动态网 ...

  6. Python加密模块

    RSA加密 # 生成公钥私钥对象 import rsa pub_key_obj, priv_key_obj = rsa.newkeys(1024) ''' 这里的1024是二进制位数, 也就是说他加密 ...

  7. Batch - forfiles 命令详解

    forfiles 命令详解 C:\Users\cuixunxu>forfiles /? FORFILES [/P pathname] [/M searchmask] [/S] [/C comma ...

  8. SQL Server中配置ODBC数据源

    单击“开始→windows系统→控制面板”,打开控制面板 单击“管理工具→ODBC数据源(32位)”打开ODBC数据源配置对话框 在数据源配置对话框中单击“系统DSN”选项卡下的“添加”按钮,创建数据 ...

  9. IDEA工具下Mybaties框架快速入门程序

    本篇文章介绍在IDEA工具下mybatis快速入门程序分为以下五步 ​ 1 添加依赖包 ​ 2 编写pojo对象 ​ 3 编写映射文件 ​ 4 编写核心配置文件 ​ 5 测试框架 详细如下 建立Mod ...

  10. Delphi中关于菜单的几个技巧

    -- 1将菜单项移到菜单栏的最右边 在一些应用程序中,常把一些特殊的菜单项放在菜单栏的最右边(如WPS2000 中的"定制界面"菜单,一些应用程序的帮助菜单),这些菜单项放在菜单栏 ...