Python 递归函数概念:Python 初学者教程
已发表: 2020-03-18在计算机科学的世界中,递归是指用自己的术语定义事物的技术。 换句话说,递归函数调用自身进行处理。 在本文中,我们将了解Python 中递归函数的概念,这是一种 21 世纪广泛使用的编程语言。
目录
什么是Python 递归?
在 Python 中,一组执行特定任务的相关语句称为“函数”。 因此,函数将您的程序分成更小的块。 众所周知,一个函数可以在 Python 中调用其他函数。
但是其他一些函数可以调用自己。 这些被称为递归函数。 考虑两个相互面对放置的平行镜子。 现在,保留在镜子之间的任何物体都将被递归反射。
让我们详细了解递归函数以清楚地了解它的工作原理。
递归函数
我们知道Python 中的递归函数调用自身,因为它是通过自引用表达式定义的,即根据自身。 它不断重复其行为,直到满足特定条件以返回值或结果。 现在让我们看一个例子来了解它是如何工作的。
另请阅读: Python 面试问答
假设你想找出一个整数的阶乘。 阶乘只不过是所有数字的乘积,从 1 到该整数。 例如,5 的阶乘(写成 5!)将是 1*2*3*4*5*6,即 720。我们有一个递归函数 calc_factorial(x),定义如下:
def calc_factorial(x):
#递归函数求整数的阶乘
如果 x == 1:
返回 1
别的
返回 (x * calc_factorial(x-1))
如果你用一个像 4 这样的正整数调用这个函数会发生什么? 好吧,每个函数调用都会添加一个堆栈帧,直到我们达到基本情况(当数字减少到 1 时)。 需要基本条件,以便递归结束并且不会无限期地继续。 因此,在给定的情况下,值 24 将在第四次调用后返回。
Python中递归函数的实现
Python中递归函数可以有多种应用。 例如,您想制作具有重复图案的图形,例如 Koch 雪花。 递归可用于生成分形图案,这些图案由相同设计的较小版本组成。
另一个例子是游戏解决。 您可以编写递归算法来解决数独和许多复杂的游戏。 递归最常用于搜索、排序和遍历问题。
该函数的一个显着特点是递归实现允许回溯。 因此,递归就是逐步构建解决方案并删除那些在任何阶段都不满足问题约束的解决方案。 实现这一点需要两件事——维护状态和合适的数据结构。 请继续阅读以熟悉这些术语。
阅读:印度的 Python 开发人员薪水
维持状态
Python 中的每个递归调用都有自己的执行上下文。 在 Python 中处理递归函数时,您必须通过每个递归调用线程化状态。 这样,当前状态就成为当前调用执行上下文的一部分。 您还可以将状态保持在全局范围内。
例如,如果您使用递归来计算 1+2+3+4+…….+10。 在这里,您添加的当前数字和累积到该点的总和形成您需要维护的状态。 维护状态涉及通过每次调用将更新的当前状态作为参数传递。 这是你如何做到的。
def sum_numbers(current_number,accumulated_sum)

#基本情况
#返回最终状态
如果当前数字==11:
返回累积的和
#递归案例
#通过递归调用线程化状态
别的:
返回 sum_numbers(current_number + 1,accumulated_sum + current_number)
或者,您可以使用全局可变状态。 要使用此方法维护状态,请将状态保持在全局范围内。
current_number = 1
累积总和 = 0
def sum_numbers():
全球 current_number
全局累计和
#基本情况
如果 current_number==11
返回累积的和
#递归案例
别的:
累计总和 = 累计总和 + 当前数
当前编号 = 当前编号 + 1
返回 sum_numbers()
递归数据结构
如果可以根据自身的更小和更简单的版本来定义数据结构,则认为它是递归的。 递归数据结构的示例包括列表、树、层次结构、字典等。列表可以有其他列表作为元素。 一棵树有子树、叶子节点等等。
在这里需要注意的是,递归函数的结构通常是在它作为输入的数据结构之后建模的。 因此,递归数据结构和递归函数齐头并进。
斐波那契计算中的递归
意大利数学家斐波那契在 13 世纪首先定义了斐波那契数,以模拟兔子的种群增长。 他推断,从第一年的一对兔子开始,某一年出生的兔子对数等于最近两年每年出生的兔子对数。 这可以写成:Fn = Fn-1 + Fn-2(基本情况:F0=1 和 F1=1)。
当你编写一个递归函数来计算斐波那契数时,它可能会导致简单的递归。 当递归函数的定义被天真地遵循时,就会发生这种情况,并且您最终会不必要地重新计算值。 为避免重新计算,您可以将 lru_cache 装饰器应用于函数。 它缓存结果并避免过程变得低效。
阅读更多:每个 Python 开发人员都应该知道的 10 大 Python 工具
递归的优缺点
递归通过将复杂任务拆分为子问题来帮助简化它。 递归函数使代码更简洁,序列生成也不复杂。 但递归并非没有局限性。 有时,调用可能会耗费大量时间和内存,因此代价高昂且效率低下。 递归函数也可能难以调试。
包起来
在本文中,我们介绍了Python 递归的概念,并通过一些示例对其进行了演示,并讨论了它的一些优点和缺点。 有了所有这些信息,你就可以在下一次 Python 面试中轻松解释递归函数了!
如果您想了解数据科学,请查看 IIIT-B 和 upGrad 的数据科学 PG 文凭,该文凭专为在职专业人士而设,提供 10 多个案例研究和项目、实用的实践研讨会、行业专家指导、1-与行业导师面对面交流,400 多个小时的学习和顶级公司的工作协助。
为什么递归如此重要?
如果您是程序员,那么递归思考对您来说非常重要。 原因是递归函数将帮助您将复杂的程序分解为更小的程序。 您还会注意到,与迭代解决方案相比,递归解决方案更易于阅读。
您经常会看到某些程序占用大量空间和代码行来运行。 有几种情况可以通过添加递归函数来简化这些程序,以便在需要时一次又一次地调用该函数。 因此,您不必编写那么多额外的代码行,并且工作也可以有效地完成。
递归的应用有哪些?
在计算功能和现实生活中都可以看到递归的大量实际应用。 如果不使用递归,就无法表达某些数学函数,例如斐波那契数列、阿克曼函数,以确定一个数字是否为回文,绘制一种分形等等。
有几个软件和应用程序是通过这些数学函数构建的。 例如,Candy Crush 使用这些数学函数和递归来生成瓷砖组合。 除此之外,国际象棋也是递归应用的一个经典例子。 我们今天使用的大多数搜索算法也使用递归。
递归的基本规则是什么?
递归函数是那些可以通过在不同的小步骤中简化复杂问题来自称为解决复杂问题的函数。 递归有四个基本规则。 必须有一个可以在没有递归帮助的情况下解决的基本情况。 应该递归解决的每个案例都应该始终朝着基本案例取得进展。 在设计规则中使用归纳证明来假设所有递归调用都有效。 您永远不应该使用单独的递归调用来解决问题的同一实例。 相反,您应该使用动态编程。