0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

所有递归代码都可以转为非递归代码

算法与数据结构 来源:码农的荒岛求生 作者:码农的荒岛求生 2022-04-19 15:02 次阅读

先说答案,这是肯定的,所有递归代码都可以转为非递归代码。

之所以所有的递归都能转为迭代算法是因为递归借助函数调用,函数调用本身就是基于调用栈这种结构实现的,只不过这一切都是自动完成的,我们当然也可以用代码手动模拟出来。

60f64680-bf93-11ec-9e50-dac502259ad0.png

我们知道将递归调用全部展开后其实会形成一棵树,把递归转为非递归无非就是在遍历这棵树,那么遍历树就有很多技术了,基于栈的深度优先遍历Depth-first traversal,或者基于队列的广度优先遍历breadth-first traversal都是可以的:

610cf696-bf93-11ec-9e50-dac502259ad0.png

哦对了,说到算法,大家赶紧去关注小风哥的算法号,这个公众号也是我亲手写的,只不过数据结构与算法这个话题有点宏大因此特意开了新号,大家快去关注吧。 说会递归转为非递归这个话题,更理论一些的解释是这样的,不管是递归还是非递归,这两者都是图灵完备的,既然是图灵完备,那么它们在表达能力上就是等价的,不存在谁不能转为谁的问题。关于图灵完备参考这篇《计算机科学中那些有趣的事实》。 只不过这存在一个难易程度的问题。 大家都知道尾递归最容易转为非递归的迭代形式,本质上是这棵树不是多叉的而是单叉的,单叉的不就退化成链表了嘛,遍历链表当然是简单的,但如果是多叉的话问题就没那么简单了,这里最有趣的是不存在一种模板可以让我们直接用套路的形式把递归转为非递归,因此这里存在一个问题:为什么你要把递归转为非递归呢?因为最终你会发现将递归转为非递归无非就是你自己接手了编译器本来已经替你完成的工作,你会发现自己在手动模拟函数调用。

61368826-bf93-11ec-9e50-dac502259ad0.png

递归的优势很明显:代码简洁,容易理解和维护,其为人诟病的地方在于执行效率“可能”没有非递归版本的高,但你最好理解这句话到底在说什么,到底哪里效率就不高了? 我们知道函数调用本身并不是免费的,函数调用也是有代价的,这里的代价就在于维护函数调用以及函数返回需要额外执行一些指令,关于这部分的内容可以参考《函数调用时底层发生了什么?》,同时栈区空间有限,因此如果你的递归调用层级太多的话可能会导致栈溢出,撑爆你的运行时环境以及可能存在重复计算问题(可以利用memory table解决),除此之外除非你有绝对令人信服的理由,否则你不应该试图将递归转为非递归。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3937

    浏览量

    61369
  • 代码
    +关注

    关注

    30

    文章

    4558

    浏览量

    66908
  • 递归
    +关注

    关注

    0

    文章

    28

    浏览量

    8976

原文标题:递归代码都可以转为非递归吗 ?

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于C语言中的递归

    递归指的是在函数的定义中使用函数自身的方法。
    发表于 02-26 10:34 134次阅读
    关于C语言中的<b class='flag-5'>递归</b>

    荣小菜补钙记第61期_LabVIEW之递归文件及文件夹

    灵活使用。 3. 遍历全部层级文件及文件夹_Demo 利用“罗列文件夹”函数,通过编写一定的逻辑,可以实现返回全部层级的文件及文件夹。代码如下。基本逻辑是遍历每一层级的文件夹,若仍存在文件夹,则继续
    发表于 02-16 21:36

    电感量一样都可以代换吗

    电感作为电路中的重要电子元器件,它在电路中的作用主要是储存能量和滤波。在电感使用中,我们经常会遇到有客户咨询关于电感替换的问题。有人问是不是电感量一样都可以替换?本篇我们就来简单探讨以下这个
    的头像 发表于 01-17 09:49 208次阅读

    感应加热技术有没有缺点?所有的工件都可以用电磁感应加热设备吗?

    感应加热技术有没有缺点?所有的工件都可以用电磁感应加热设备吗
    的头像 发表于 12-19 14:17 408次阅读

    python数字排列组合需要缩进吗

    在Python中,数字排列组合的实现通常需要使用循环和递归来生成所有可能的组合。对于代码块中的循环和递归部分,缩进是必需的,它用于标识这些语句属于循环或
    的头像 发表于 11-29 16:40 201次阅读

    为什么任何信号都可以分为共模和差模的叠加呢?

    为什么任何信号都可以分为共模和差模的叠加呢? 任何信号都可以分为共模和差模的叠加是因为信号的传输和处理中存在一定的干扰和噪声。 共模信号是指同时作用于信号的两个正负极性导线或端口的信号,其大小和方向
    的头像 发表于 11-20 16:28 437次阅读

    所有的单比特信号跨时钟域都可以用敲两级DFF的办法处理吗?

    用敲两级DFF的办法(两级DFF同步器)可以实现单比特信号跨时钟域处理。但你或许会有疑问,是所有的单比特信号跨时钟域都可以这么处理吗?
    的头像 发表于 06-28 11:39 752次阅读
    <b class='flag-5'>所有</b>的单比特信号跨时钟域<b class='flag-5'>都可以</b>用敲两级DFF的办法处理吗?

    递归函数计算斐波那契数列中的第n项值

    编写一个递归函数,用于计算斐波那契数列中的第n项值,并在主函数中调用该函数输出斐波那契数列的前15项。
    的头像 发表于 06-07 11:30 1977次阅读

    C语言,你真的懂递归了吗?

    要说到递归如果不说栈的话,我觉得有点不合适,递归特点就是不断的调用同一个函数,如果这个函数没有一个递归界限,那么就是死循环了,所以讨论递归,就必须要讨论
    的头像 发表于 06-06 15:24 766次阅读
    C语言,你真的懂<b class='flag-5'>递归</b>了吗?

    PyTorch教程10.4之双向递归神经网络

    电子发烧友网站提供《PyTorch教程10.4之双向递归神经网络.pdf》资料免费下载
    发表于 06-05 15:13 0次下载
    PyTorch教程10.4之双向<b class='flag-5'>递归</b>神经网络

    PyTorch教程10.3之深度递归神经网络

    电子发烧友网站提供《PyTorch教程10.3之深度递归神经网络.pdf》资料免费下载
    发表于 06-05 15:12 0次下载
    PyTorch教程10.3之深度<b class='flag-5'>递归</b>神经网络

    PyTorch教程16.2之情感分析:使用递归神经网络

    电子发烧友网站提供《PyTorch教程16.2之情感分析:使用递归神经网络.pdf》资料免费下载
    发表于 06-05 10:55 0次下载
    PyTorch教程16.2之情感分析:使用<b class='flag-5'>递归</b>神经网络

    PyTorch教程9.6之递归神经网络的简洁实现

    电子发烧友网站提供《PyTorch教程9.6之递归神经网络的简洁实现.pdf》资料免费下载
    发表于 06-05 09:56 0次下载
    PyTorch教程9.6之<b class='flag-5'>递归</b>神经网络的简洁实现

    PyTorch教程之从零开始的递归神经网络实现

    电子发烧友网站提供《PyTorch教程之从零开始的递归神经网络实现.pdf》资料免费下载
    发表于 06-05 09:55 0次下载
    PyTorch教程之从零开始的<b class='flag-5'>递归</b>神经网络实现

    自顶向下的语法分析器—采用递归下降方法

    在之前已经通过手写的方式实现了一个词法分析器,现在,我将利用之前手写的词法分析器,使用递归下降的方式,实现一个简单的语法分析器。
    的头像 发表于 05-23 11:24 1512次阅读
    自顶向下的语法分析器—采用<b class='flag-5'>递归</b>下降方法