当前位置:

首页 > 编程开发 > 如何更好地理解递归算法?Python实例详解

如何更好地理解递归算法?Python实例详解

递归确实是一种较为抽象的数学逻辑,可以简单的理解为「程序调用自身的算法」。维基百科对递归的解释是:递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。"递"是传递的意思,"归"是归还的意思,先把一个方法一层层传递下去,然后传递到最后一层再把结果归还回来。比方说我排队做核酸检测,前面有100个人,我想问

本文目录

    如何更好地理解递归算法?Python实例详解

    递归确实是一种较为抽象的数学逻辑,可以简单的理解为「程序调用自身的算法」。

    维基百科对递归的解释是:

    递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。

    例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。

    "递"是传递的意思,"归"是归还的意思,先把一个方法一层层传递下去,然后传递到最后一层再把结果归还回来。

    如何更好地理解递归算法?Python实例详解

    比方说我排队做核酸检测,前面有100个人,我想问下医务人员几点下班,于是问了我前面那兄弟,他又问了他前面的人,一个个传递下去,最终传递到了医务人员那里,回话说下午六点下班。这句话又往回传,最终到了我这里,我知道了医务人员六点下班。

    这个过程就是一个递归过程,如果说"传话"本身是一种方法,那这整个传话过程就是在调用自身方法,最终获得了结果。

    这和循环不一样,循环相当于给所有人都所有人都戴了耳机,然后有"中介"挨个去问你知道医务人员几点下班吗,等问到医务人员的时候,得到答案,“中介”告诉我六点下班。

    实质上,递归就是把一个大问题不断拆解,像剥洋葱一样,最终拆解到最小层面,会返回解题结果。

    如何更好地理解递归算法?Python实例详解

    用Python举一个最简单的递归函数例子,讲一讲什么是递归的应用。

    我们经常会看到函数会调用自身来实现循环操作,比如求阶乘的函数。

    整数n的阶乘即n*(n-1)*(n-2)*...*3*2*1。

    如下面5行Python代码,就能实现阶乘的计算。

    def fact(n):
    ''' n表示要求的数的阶乘 '''
    if n==1:
    return n 
    n = n*fact(n-1)
    return n
    print(factorial(5))
    

    很多人可能困惑这里面的计算逻辑,为什么fact函数中调用了自身,最终能得到结果。

    我们可以按照数学逻辑进行推演:

    整数n的阶乘是:fact(n) = n*(n-1)*...*3*2*1。

    整数n-1的阶乘是:fact(n-1) = (n-1)*(n-2)*...*3*2*1。

    所以可以推断 fact(n) = n*fact(n-1)。

    如何更好地理解递归算法?Python实例详解

    这里是不是一种 fact方法可以为每个数所调用,最终调用到了n=1的时候,就返回结果n的阶乘。

    如何更好地理解递归算法?Python实例详解

    大家看上图,递归函数会一层层往下调用,最终到n=1的时候,往上返回结果。

    这就是递归的全过程,如果我们给递归下一个准确的定义,可以概括为以下3点:

    1、至少有一个明确的递归结束条件。

    2、给出递归终止时的处理办法。

    3、每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少。

    以上面代码为例:

    def factorial(n):
    ''' n表示要求的数的阶乘 '''
    if n==1: # 1、明确递归终止条件;
    return n # 2、递归终止时的处理办法
    n = n*factorial(n-1) # 递去
    return n# 归来
    

    除了常见的阶乘案例,还有斐波那契数列,也是递归的经典用法。

    斐波那契数列:1,1,2,3,5,8,13,21,34,55,89...

    这个数列从第3项开始,每一项都等于前两项之和。

    它以如下被以递推的方法定义:F(0)=0,F(1)=1,F(n)=F(n - 1)+F(n - 2)(n≥ 2,n∈ N*)。

    在Python中,我们可以使用递归函数的方式去实现斐波那契数列:

    # 1,1,2,3,5,8,13,21,34,55,试判断数列第12个数是哪个?
    def fab(n):
    ''' n为斐波那契数列 '''
    if n <= 2:
    v = 1
    return v 
    v = fab(n-1)+fab(n-2) 
    return v
    
    print(fab(12)) 
    

    使用数学方法进行推导:

    • fab(0) = 0(初始值)。
    • fab(1) = 1(初始值)。
    • 对所有大于1的整数n:fab(n) = fab(n-1)+ fab(n-2)(递归定义)。

    其实以上两个递归的案例都可以用数学归纳法来解释,就是高中数学学的知识。

    一般地,证明一个与自然数n有关的命题P(n),有如下步骤:

    (1)证明当n取第一个值n0时命题成立。n0对于一般数列取值为0或1,但也有特殊情况。

    (2)假设当n=k(k≥n0,k为自然数)时命题成立,证明当n=k+1时命题也成立。

    综合(1)(2),对一切自然数n(≥n0),命题P(n)都成立。

    除了数学的解释,之前也看到有人对递归更加形象的解释:

    1、我们已经完成了吗?如果完成了,返回结果。如果没有这样的终止条件,递归将会永远地继续下去。

    2、如果没有,则简化问题,解决较容易的问题,并将结果组装成原始问题的解决办法。然后返回该解决办法。

    哈哈,到这里大家是不是对递归有了一个更加深刻的认识。

    如果还不清楚,没关系,这里还有更多的递归案例,用Python来实现,可以说非常简洁。

    「最大公因数:」

    def gcd(m, n):
    if n == 0:
    return m
    else:
    return gcd(n, m%n)
    

    「从 1 到 n 的数字之和:」

    def sumnums(n):
    if n == 1:
    return 1
    return n + sumnums(n - 1)
    
    print(sumnums(3))
    

    「字符串倒序:」

    def reverse(string):
    if len(string) == 0:
    return string
    else:
    return reverse(string[1:]) + string[0]
    
    reverseme = '我是帅哥'
    print(reverse(reverseme))
    

    「汉诺塔问题:」

    def towerOfHanoi(numrings, from_pole, to_pole, aux_pole):
    if numrings == 1:
    print('Move ring 1 from', from_pole, 'pole to', to_pole, 'pole')
    return
    towerOfHanoi(numrings - 1, from_pole, aux_pole, to_pole)
    print('Move ring', numrings, 'from', from_pole, 'pole to', to_pole, 'pole')
    towerOfHanoi(numrings - 1, aux_pole, to_pole, from_pole)
    numrings = 2
    towerOfHanoi(numrings, 'Left', 'Right', 'Middle')
    

    「二分法找有序列表指定值:」

    data = [1,3,6,13,56,123,345,1024,3223,6688]
    def dichotomy(min,max,d,n):
    '''
    min表示有序列表头部索引
    max表示有序列表尾部索引
    d表示有序列表
    n表示需要寻找的元素
    '''
    mid = (min+max)//2
    if mid==0:
    return 'None'
    elif d[mid]n:
    print('向左侧找!')
    return dichotomy(min,mid,d,n)
    else:
    print('找到了%s'%d[mid])
    return 
    res = dichotomy(0,len(data),data,222)
    print(res)
    

    有位大佬说过:To Iterate is Human, to Recurse, Divine。

    中文译为:人理解迭代,神理解递归。

    可见递归是非常神奇的算法,它的神奇之处在于它允许用户用有限的语句描述无限的对象。

    当然人无完人,递归也是有缺点的,它一般效率较低,且会导致调用栈溢出。

    因为递归不断调用自身函数,且产生大量变量,而栈空间的容量是有限的,循环太多就会效率低下,甚至导致调用栈溢出。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。