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

    文章

    4338

    浏览量

    62739
  • 代码
    +关注

    关注

    30

    文章

    4801

    浏览量

    68735
  • 递归
    +关注

    关注

    0

    文章

    28

    浏览量

    9038

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

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

收藏 人收藏

    评论

    相关推荐

    java反编译的代码可以修改么

    Java反编译是一种将编译后的Java字节码(.class文件)转换回源代码的过程。反编译后的代码可以进行修改,但是需要注意,反编译代码的质量和可读性可能会受到原始编译
    的头像 发表于 09-02 11:00 734次阅读

    hex可以转成源代码

    Hex文件可以转换成源代码的近似形式,但无法直接还原为原始的、完全相同的源代码 。这是因为Hex文件是二进制文件,包含了程序编译后的机器码,这些机器码与原始的源代码在结构和表达上存在显
    的头像 发表于 09-02 10:41 1087次阅读

    Python递归的经典案例

    当我们碰到诸如需要求阶乘或斐波那契数列的问题时,使用普通的循环往往比较麻烦,但如果我们使用递归时,会简单许多,起到事半功倍的效果。这篇文章主要和大家分享一些和递归有关的经典案例,结合一些资料谈一下个人的理解,也借此加深自己对递归
    的头像 发表于 08-05 15:57 346次阅读

    人员定位系统都可以用于哪些行业?

    。 一、人员定位系统都可以用于哪些行业? 这套系统可以服务的行业非常多,尤其是岗位具有一定危险性的,那么定位系统可以说发挥的作用十分明显,比如化工厂、消防员、矿井、户外勘探等,而为了便于人员管理的场景也
    的头像 发表于 07-15 11:32 376次阅读
    人员定位系统<b class='flag-5'>都可以</b>用于哪些行业?

    递归神经网络和循环神经网络的模型结构

    递归神经网络是一种旨在处理分层结构的神经网络,使其特别适合涉及树状或嵌套数据的任务。这些网络明确地模拟了层次结构中的关系和依赖关系,例如语言中的句法结构或图像中的层次表示。它使用递归操作来分层处理信息,有效地捕获上下文信息。
    的头像 发表于 07-10 17:21 687次阅读
    <b class='flag-5'>递归</b>神经网络和循环神经网络的模型结构

    递归神经网络的实现方法

    递归神经网络(Recursive Neural Network,简称RNN)是一种特殊类型的神经网络,其特点在于能够处理具有层次或树状结构的数据,并通过递归的方式对这些数据进行建模。与循环神经网络
    的头像 发表于 07-10 17:02 349次阅读

    rnn是递归神经网络还是循环神经网络

    RNN(Recurrent Neural Network)是循环神经网络,而非递归神经网络。循环神经网络是一种具有时间序列特性的神经网络,能够处理序列数据,具有记忆功能。以下是关于循环神经网络的介绍
    的头像 发表于 07-05 09:52 594次阅读

    递归神经网络结构形式主要分为

    递归神经网络(Recurrent Neural Networks,简称RNN)是一种具有时间序列处理能力的神经网络,其结构形式多样,可以根据不同的需求进行选择和设计。本文将介绍递归神经网络的几种主要
    的头像 发表于 07-05 09:32 569次阅读

    递归神经网络与循环神经网络一样吗

    递归神经网络(Recursive Neural Network,RvNN)和循环神经网络(Recurrent Neural Network,RNN)是两种不同类型的神经网络结构,它们在处理序列数据
    的头像 发表于 07-05 09:28 906次阅读

    递归神经网络主要应用于哪种类型数据

    处理(NLP) 自然语言处理是递归神经网络最重要的应用领域之一。在NLP中,递归神经网络可以用于以下任务: 1.1 语言模型(Language Modeling) 语言模型是预测给定词序列中下一个词的概率分布。
    的头像 发表于 07-04 14:58 848次阅读

    递归神经网络是循环神经网络吗

    递归神经网络(Recurrent Neural Network,简称RNN)和循环神经网络(Recurrent Neural Network,简称RNN)实际上是同一个概念,只是不同的翻译方式
    的头像 发表于 07-04 14:54 809次阅读

    递归神经网络的结构、特点、优缺点及适用场景

    递归神经网络(Recurrent Neural Networks,简称RNN)是一种具有循环结构的神经网络,其核心特点是能够处理序列数据,并对序列中的信息进行记忆和传递。RNN在自然语言处理、语音
    的头像 发表于 07-04 14:52 1530次阅读

    关于C语言中的递归

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

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

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

    电感量一样都可以代换吗

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