当前位置:首页 > Python技术文章 > 详解python中递归函数

怎样使用python中递归函数

  • 发布时间:
  • 作者:码农之家原创
  • 点击:115

这篇文章主要知识点是关于python、递归函数、Python 递归函数详解及实例 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下相关资源

零基础入门学习Python(含视频、源码)

本书是一本Python 3.7编程轻松入门教程,前半部分首先讲解基础的Python 3语法知识,后半部分则围绕着Python 3在爬虫、界面开发和游戏开发上的应用,循序渐进,欢迎下载

查看详情

详解python中递归函数

函数执行流程

def foo1(b,b1=3):
   print("foo1 called",b,b1)
 
 def foo2(c):
    foo3(c)
    print("foo2 called",c)
 def foo3(d):
   print("foo3 called",d)
 def main():
   print("main called")
   foo1(100,101)
   foo2(200)
   print("main ending ")

函数执行过程:

  1. 全局帧中生成foo1、foo2、foo3、main函数对象
  2. main函数调用
  3. main中查找内建函数print压栈,将常量字符串压栈,调用函数,弹出栈顶,返回值。
  4. main中全局查找foo1压栈,将常量100、101压栈,调用函数foo1,创建栈帧。print函数压栈,字符串和变量b、b1压栈,调用函数,弹出栈顶,返回值。
  5. main中全局查找foo2函数压栈,将常量200压栈,调用foo2,创建栈帧。foo3函数压栈,变量c引用压栈,调用foo3函数,创建栈帧,foo3中内建函数中查找print压栈,将字符常量和变量d压栈。foo3完成print函数调用后返回。foo2恢复调用,执行print后,返回值,main中foo2调用结束后弹出栈顶,main继续执行print函数调用,弹出栈顶,main函数返回

 函数中压栈,执行流程。

递归Recursion

  1. 函数直接或者间接调用自身就是递归
  2. 递归需要有边界条件、递归前进段,递归返回段
  3. 递归一定需要有边界条件
  4. 当边界条件不满足的时候,递进前进
  5. 当边界条件满足的时候,递归返回

 递归要求

  1. 递归一定要有退出条件,递归调用一定执行到这个退出条件。没有退出条件的递归调用,就是无限调用
  2. 递归调用的深度不宜过深
  3. python对递归调用的深度做了限制,以保护解释器,cpython中递归深度为1000,ipython中递归深度为3000
  4. 超过递归深度限制,抛出RecursionError:maxinum recursion depth exceeded 超出最大深度
  5. sys.getrecursionlimit()是显示最大限制
  6. 对于基于前面或者换位置的时候使用封装和解构更有效

斐波那契数列实现(f(1)=1,f(2)=1,f(3)=f(1)+f(2),f(4)=f(2)+f(3)……)

#斐波那契数列普通循环实现
a,b=0,1
for i in range(4):
  a,b=b,a+b
print(a)

#斐波那契数列函数递归实现
def foo(n): #大量的重复计算
   return 1 if n<3 else foo(n-1)+foo(n-2) 
 
#斐波那契数列函数循环实现
def fn(n,a=0,b=1):
  a,b=b,a+b
  if n==1:
    return a
  return fn(n-1,a,b)

递归的性能

循环稍微复杂一些,但是只要不是死循环,可以多次迭代直至算出结果
递归还有深度限制,如果递归复杂,函数反复压栈,栈内存很快会溢出

间接递归

def foo1():
  foo2()
def foo2():
  foo1()

间接递归,是通过别的函数调用了函数自身,但是如果构成了循环递归调用是非常危险的,但是往往这种情况在代码复杂的情况下,还是有可能发生这种调用的,要用代码的规范来避免这种递归调用的发生

递归总结

  1. 递归是一种很自然的表达,符合逻辑思维
  2. 递归相对运行效率低,每一次调用函数都要开辟新的栈帧
  3. 递归有深度限制,如果递归层次太深,函数反复压栈,栈内存很快就溢出了
  4. 如果是有限次数的递归,可以使用递归调用,或者使用循环代替,循环代码稍微复杂一些,但是只要不是死循环,过次迭代直至算出结果
  5. 绝大多数递归,都可以使用循环实现
  6. 即使递归代码很简洁,能不用尽量不使用递归

以上所述是小编给大家介绍的python递归函数详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

Python 递归函数详解及实例

Python 递归函数

如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要付出一定的努力去理解和创建.
我们会以一个简单的例子开始:写一个函数求一个自然数中所有数字的和.在设计递归函数的时候,我们会寻找能把问题分解成简单的问题的方法.在这道题中,运算符%和//可以用来把一个数分成两部分:最低位和不包含最低位数字两部分.

Python 递归函数详解及实例

18117的数字和为:1+8+1+1+7=18.这样我们就可以分割这个数.把这个数分割成最低位7和不包含最低位数字的和1+8+1+1=11.这种分割方法给我们提供了一个算法:通过最低位n%10与n//10的数字之和相加来计算数n的数字之和.这种方法存在特殊情况:如果一个数只有一位,那么它的数字之和就是它本身.这个算法可以用递归函数实现.

def sum_digit(n):
  """return the sum of the digit of positive integer n."""
  if n < 10:
    return n
  else:
   last = n % 10
   all_but_last = n // 10
   return sum_digit(all_but_last) + last

函数sum_digit的定义是完整和正确的,即使sum_digit函数在自身的函数体里被调用.

这样求一个数的数字之和的问题就被分解成了两部分:求除去最低位部分数字之和,然后加上最低位.这两个步骤全都比原问题要简单.这个函数是递归的,因为第一步的问题和原问题是相同类型的.也就是说,sum_digit的确实是我们需要去实现自然数数字求和的函数.

Python 递归函数详解及实例

我们可以理解这个递归函数是怎样使用计算环境模型成功应用的.它 不需要任何新的规范.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

以上就是本次给大家分享的关于Python的全部知识点内容总结,大家还可以在下方相关文章里找到python求最大值最小值的实、 Python调用C# Com dll组件的方、 Python工具整理推荐、 等python文章进一步学习,感谢大家的阅读和支持。

上一篇:Python3中函数参数传递方式浅析

下一篇:python修改json文件的value实例方法

展开 +

收起 -

python中递归函数 相关内容
详解Python函数any()和all()的用法和区别

在本篇文章中我们给读者们详细介绍了关于Python中any()和all()的函数用法区别和详细用法,有兴趣的朋友们学习下。

查看详情
《Python编程:从入门到实践》第八章:函数

8-1 消息 编写一个名为display_message() 的函数,它打印一个句子,指出你在本章学的是什么。调用这个函数,确认显示的消息正确无误。 # -*- coding : utf-8 -*-def display_messages(): print(本章学习的是函数)if __name__ == __main__: display_messages() 结果: 8-2 喜欢的图书 编写一个名为favorite_book() 的函数,其中包含一个名为title 的形参。这个函数打印一条消息,如One

查看详情
python利用Future对象回调别的函数知识点总结

最近在学习python,所以这篇文章主要给大家介绍了关于在python中利用Future对象回调别的函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需

查看详情
Python3中函数参数传递方式浅析

这篇文章主要介绍了Python3中函数参数传递方式,结合实例形式较为详细的分析了Python3中函数参数传递的常见操作技巧,需要的朋友可以参考下

查看详情
从芯片到云端:Python物联网全栈开发实践

本书从物联网的基础概念开始,到相关技术选型、开源工程、参考设计与经验分享,利用Python可加快开发迭代速度、降低开发成本,并可以基于嵌入式Python建立完整的物联网软硬件生态

查看详情
Python机器学习:预测分析核心算法

在学习和研究机器学习的时候,面临令人眼花缭乱的算法,机器学习新手往往会不知所措。本书从算法和Python语言实现的角度,帮助读者认识机器学习。 本书专注于两类核心的算法族,即惩罚

查看详情
Python科学计算

本书详细介绍Python科学计算中最常用的扩展库NumPy、SciPy、matplotlib、Pandas、SymPy、TTK、Mayavi、OpenCV、Cython,涉及数值计算、界面制作、三维可视化、图像处理、提高运算效率等多方面的内容。所

查看详情
Python数据可视化

本书介绍了利用Python实现数据可视化。并介绍了数据、信息与知识之间的关系,想要学习Python数据可视化的同学可以下载参考一下

查看详情
Python3爬虫、数据清洗与可视化实战

这是一套通过实战教初学者学习采集数据、清洗和组织数据进行分析及可视化的Python读物。以Python爬虫技术应用实战为主,适合Python 初学者及高等院校的相关专业学生

查看详情
Python编程之美:最佳实践指南

这书由Python小区的高手KennethReitz进行并机构撰写,由小区数十名开发人员团体无私奉献。*的特点取决于,几近详细地小结了在Python程序编写时会采用的各种各样实践活动方法和工作经验,包含

查看详情
Python数据分析与数据化运营

这书內容从逻辑性上共分成两绝大多数,第壹一部分是相关数据统计分析类的主题风格,其次一部分是相关数字化经营的主题风格。第壹一部分的內容包含1/2/3/4章和附则,关键详细介绍了Pyt

查看详情
python中递归函数 学习笔记
网友NO.920548

Python递归函数实例讲解

Python递归函数实例 1、打开Python开发工具IDLE,新建‘递归.py'文件,并写代码如下: def digui(n): if n == 0 : print ('') return print ('*'*n) digui(n-1)if __name__ == '__main__': digui(5) 这里递归打印*号,先打印后递归 2、F5运行程序,打印内容如下; ***** **** *** ** * 3、更改一下打印和递归的 顺序,先递归后打印,代码如下: def digui(n): if n == 0 : print ('') return digui(n-1) print ('*'*n) if __name__ == '__main__': digui(5) 4、F5运行程序,打印内容如下; * ** *** **** ***** 这是因为打印在最后,要等待执行到n==0,函数才能return。 5、再更改递归函数,递归函数带返回值,代码如下: def digui(n): if n == 0 : return 0 return n+digui(n-1) if __name__ == '__main__': print (digui(5)) 此函数作用从5+4+3+2+1+0累加结果。直到n==0时候返回。 6、F5运行程序,打印累加结果15 上面就是关于Python递归函数的相关知识点,感谢大家的阅读……

网友NO.675144

让你Python到很爽的加速递归函数的装饰器

今天我们会讲到一个[装饰器] 注记:链接“装饰器”指Python3教程中的装饰器教程。可以在这里快速了解什么是装饰器。 @functools.lru_cache——进行函数执行结果备忘,显著提升递归函数执行时间。 示例:寻找宝藏。在一个嵌套元组tuple或列表list中寻找元素'Gold Coin' import timefrom functools import lru_cachedef find_treasure(box): for item in box: if isinstance(item, (tuple, list)): find_treasure(item) elif item == 'Gold Coin': print('Find the treasure!') return Truestart = time.perf_counter()find_treasure(('sth', 'sth', 'sth', ('Bad Coin', 'normal coin', 'fish', 'sth', 'any sth'), ('Bad Coin', 'normal coin', 'fish', 'sth', 'any sth'), 'Gold Coin', ))end = time.perf_counter()run_time_without_cache = end - startprint('在没有Cache的情况下,运行花费了{} s。'.format(run_time_without_cache))@lru_cache()def find_treasure_quickly(box): for item in box: if isinstance(item, (tuple, list)): find_treasur……

网友NO.886887

python递归函数绘制分形树的方法

分形几何学的基本思想:客观事物具有自相似性的层次结构,局部和整体在形态,功能,信息,时间,空间等方面具有统计意义上的相似性,称为自相似性,自相似性是指局部是整体成比例缩小的性质。 我们先看一下我们最终要绘制的图形: 案例分析: 代码: ## 绘制分型树,末梢的树枝的颜色不同import turtledef draw_brach(brach_length): if brach_length 5: if brach_length 40: turtle.color('green') else: turtle.color('red') # 绘制右侧的树枝 turtle.forward(brach_length) print('向前',brach_length) turtle.right(25) print('右转20') draw_brach(brach_length-15) # 绘制左侧的树枝 turtle.left(50) print('左转40') draw_brach(brach_length-15) if brach_length 40: turtle.color('green') else: turtle.color('red') # 返回之前的树枝上 turtle.right(25) print('右转20') turtle.backward(brach_length) print('返回',brach_length)def main(): turtle.left(90) turtle.penup() turtle.backwa……

网友NO.633295

Python进阶之递归函数的用法及其示例

作者是一名沉迷于Python无法自拔的蛇友,为提高水平,把Python的重点和有趣的实例发在简书上。 一、递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。 (来源于百度,看不懂正常,术语就是不说人话) 下面是笔者的个人理解:递归就是在函数内部调用自己的函数被称之为递归。 看不懂?形象的举几个例子! 一个洋葱是一个带着一层洋葱皮的洋葱。 递归就是包子馅的包子,它的极限……

网友NO.668622

python中递归函数如何创建

递归函数是编程技术之一,这意味着你的程序包含你自己调用的函数。与迭代函数一样,在多次执行类似处理时可以使用递归函数,但递归函数可以通过用简单的代码替换它们来处理更复杂的问题。本篇文章我们就来看看python中递归函数的创建。 递归函数用于以下情况。 1、数据处理 在对多个数据进行排序或执行重复处理时,根据数据结构可以使用递归函数。 2、可以解决一些复杂的算法问题 一个常见的例子是“汉诺塔”的问题。根据某个规则,对于每次更改状态的处理,使用递归函数可以以一个简单的问题替换并处理它 3、语法分析(自然语言处理) 在自然语言处理中,可以使用递归函数来执行将句子分解为单词的处理。 如何在python中创建递归函数? Python允许用户使用自定义的函数创建递归函数。 def myfunc(x): if 结束条件: return x // 进行什么样的处……

<
1
>

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757