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

    文章

    4406

    浏览量

    66819
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73130
  • 递归
    +关注

    关注

    0

    文章

    29

    浏览量

    9262

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度休眠状态下外部所有的IO都可以唤醒MCU吗?

    深度休眠状态下,外部所有的IO都可以唤醒MCU吗?
    发表于 12-04 06:00

    请问CW32L010是低功耗下2个串口都可以使用吗?

    CW32L010是低功耗下2个串口都可以使用吗?
    发表于 12-01 07:07

    HarmonyOS应用代码混淆技术方案

    代码混淆技术可以增加代码的复杂性和模糊性,从而提高攻击者分析代码的难度。
    的头像 发表于 11-21 16:17 5330次阅读
    HarmonyOS应用<b class='flag-5'>代码</b>混淆技术方案

    请问CW32的pwm移相功能是只有PWM通道1有还是全部都可以配置?

    请问CW32的pwm移相功能是只有PWM通道1有还是全部都可以配置?做三相移相时需不需要额外的处理?
    发表于 11-21 06:22

    代码开发平台推荐:2025国内低代码开发平台排名TOP10

    代码开发平台排行榜 在企业数字化转型的浪潮中,低代码开发平台正逐渐成为企业实现高效开发和快速迭代的重要工具。随着技术的不断进步和市场需求的持续增长,低代码开发平台的市场竞争也日益激烈。以下
    的头像 发表于 10-28 10:22 308次阅读

    飞凌嵌入式ElfBoard ELF 1板卡-Linux系统基础入门-目录相关shell命令

    参数:ls[选项]目录目录缺省时,默认为当前目录;选项如下,选项可以组合使用。选项说明空列出目录下所有隐藏文件(包括目录)-a列出目录下所有文件,包括隐藏文件-l列出目录下
    发表于 09-29 10:12

    京东比价项目开发实录:京东API接口(2025)

    这些年踩过的坑、写过的代码,都成了宝贵的经验。如果有遇到其他问题都可以一起交流! ​
    的头像 发表于 08-22 09:53 698次阅读
    京东比价项目开发实录:京东API接口(2025)

    NuMicro 中的每个 ADC 通道都可以吗?

    NuMicro 中的每个 ADC 通道都可以吗?具有相同模块的系列微控制器同时采样?
    发表于 08-22 06:29

    LABVIEW递归获取列表显示到树形结构

    我这个递归我逻辑没问题啊!我断点调试看了,是因为重入VI执行没有把树形结构里面节点传入到下一个递归调用,进入重调用的时候我看了树形结构里面节点是空的。第一次写入的节点并没有传入到下一次递归。 反正很
    发表于 08-07 17:59

    怎么把UI设计稿转为代码?在线UI设计工具一键生成!

    近日,华为开发者大会2025(HDC)在东莞松山湖正式拉开帷幕,这场备受瞩目的盛会为全球科技行业带来了诸多惊喜。其中,Pixso团队发布的全新设计稿一键转代码功能,成为了本次大会的一大亮点。这项创新
    的头像 发表于 06-25 12:04 747次阅读
    怎么把UI设计稿<b class='flag-5'>转为</b><b class='flag-5'>代码</b>?在线UI设计工具一键生成!

    OLED代码分享

    OLED代码
    发表于 04-29 17:04 1次下载

    ads1256能够对寄存器值操作,读写都可以,就是读出的AD值不正确,为什么?

    ads1256能够对寄存器值操作,读写都可以,就是读出的AD值不正确,电路直接照手册参考电路接的,参考电压直接拉到5V用面包板搭的电路。
    发表于 02-12 07:38

    分析C语言代码结构的设计问题

    来分析一个C语言代码结构的设计问题。 这段代码,使用了两次malloc,分别给 p1 和 p2 申请了内存。用完后,内存释放,防止内存泄漏。 大家觉得,这样的代码设计有没有问题。 代码
    的头像 发表于 02-11 09:31 658次阅读

    代码与传统开发的区别 低代码与无代码开发的区别

    的工具和图形界面来缩短开发时间和降低技术门槛。以下是对低代码开发与传统开发的详细对比: 适用人群 传统开发 :主要适用于有经验、有基础的程序员,他们可以利用各种编码语言进行应用程序的创建。传统开发需要深厚的编程功底
    的头像 发表于 01-31 10:48 1052次阅读

    代码在敏捷开发中的应用

    代码平台的定义 低代码平台提供了一个可视化的、拖放式的用户界面,允许开发者通过图形化的方式快速构建应用程序,而无需编写大量的代码。这些平台通常包括预构建的模板、组件和逻辑模块,使得开发人员
    的头像 发表于 01-07 09:58 748次阅读