展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 如何更好地理解递归算法?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
    相关文章 更多
    精品专题 更多
    装机必备

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

    Windows

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

    PDF教程

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

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版

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

    火山引擎 网页版
    火山引擎 网页版

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

    Aperty macOS版
    Aperty macOS版

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

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版

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

    火山引擎 网页版
    火山引擎 网页版

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

    PixTV 网页版
    PixTV 网页版

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

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

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

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。