Python递归算法详解

简介: Python递归算法详解

递归的概念很简单,如果函数包含了对其自身的调用,该函数就是递归的。


递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。


在使用递归时,需要注意以下几点:


递归就是在过程或函数里调用自身


必须有一个明确的递归结束条件,称为递归出口。


注意: 切勿忘记递归出口,避免函数无限调用。


递归基本步骤

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


1.初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值。


2.检查要处理的当前值是否已经与基线条件相匹配(base case)。如果匹配,则进行处理并返回值。


3.使用更小的或更简单的子问题(或多个子问题)来重新定义答案。


4.对子问题运行算法。


5.将结果合并入答案的表达式。


6.返回结果。


基线条件(base case)。基线条件是递归程序的最底层位置,在此位置时没有必要再进行操作,可以直接返回一个结果。所有递归程序都必须至少拥有一个基线条件,而且必须确保它们最终会达到某个基线条件;否则,程序将永远运行下去,直到程序缺少内存或者栈空间。


主要应用范围

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


(1)数据的定义是按递归定义的。(比如Fibonacci函数)


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


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


典型的算法

大多数学过数学、计算机科学或者读过编程相关书籍的人,想必都会遇到阶乘:


n! = 1 × 2 × 3 × … × n


也可以用递归方式定义:


n! = (n-1)! × n


其中,n >= 1,并且 0! = 1。


由于简单、清晰,因此其常被用作递归的示例。


PS: 除了阶乘以外,还有很多算法可以使用递归来处理,例如:斐波那契数列、汉诺塔等。


非递归实现


def factorial(n):

result = 1

for i in range(2, n+1):

result *= i

return result

阶乘函数的递归实现


def factorial(n):

if n == 0 or n == 1: return 1

else: return (n * factorial(n - 1))

递归过程

为了明确递归步骤,对 5! 进行过程分解:


factorial(5) # 第 1 次调用使用 5

5 * factorial(4) # 第 2 次调用使用 4

5 * (4 * factorial(3)) # 第 3 次调用使用 3

5 * (4 * (3 * factorial(2))) # 第 4 次调用使用 2

5 * (4 * (3 * (2 * factorial(1)))) # 第 5 次调用使用 1

5 * (4 * (3 * (2 * 1))) # 从第 5 次调用返回

5 * (4 * (3 * 2)) # 从第 4 次调用返回

5 * (4 * 6) # 从第 3次调用返回

5 * 24 # 从第 2 次调用返回

120 # 从第 1 次调用返回


还是这个函数factorial(N),让我们试试N = 999和N = 1000,问题来了,N = 999时能输出正确答案,但当N = 1000时,就出现下面的错误了:


RuntimeError: maximum recursion depth exceeded


于是,请记住,默认的Python有一个可用的递归深度的限制,以避免耗尽计算机中的内存。默认是1000。


递归优缺点

优点:


递归使代码看起来更加整洁、优雅


可以用递归将复杂任务分解成更简单的子问题


使用递归比使用一些嵌套迭代更容易


缺点:


递归的逻辑很难调试、跟进


递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。



相关文章
|
26天前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
45 0
|
29天前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
53 4
|
29天前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
57 6
|
27天前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
50 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
8天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
12 3
|
11天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
32 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
16天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
24天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
49 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
87 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1月前
|
存储 算法 安全
Python 加密算法详解与应用
Python 加密算法详解与应用
20 1