首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与迭代相比,使用递归是否有优势--除了有时可读性和优雅性之外?

与迭代相比,使用递归是否有优势--除了有时可读性和优雅性之外?
EN

Software Engineering用户
提问于 2014-06-03 15:07:23
回答 3查看 41.8K关注 0票数 13

我要做两个假设。如果他们错了,请纠正我:

  1. 没有迭代等价的递归算法。
  2. 从性能上讲,迭代总是比递归更便宜(至少在一般的语言中是这样的,比如Java、C++、Python等)。

如果递归总是比迭代更昂贵,并且总是可以用迭代算法(在允许递归的语言中)来代替的话--那么我认为使用递归的其余两个原因是:优雅和可读性。

一些算法用递归的形式表达得更好。扫描二叉树。

然而,除此之外,是否有任何理由在迭代中使用递归?与迭代相比,递归是否比有时优雅和可读性更好?

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2014-06-03 16:58:09

通常情况下这是较少的代码。

而且,在某种程度上,它的代码更少,更容易出错。

特别是,当迭代解决方案要求您用堆栈模拟递归时,递归非常有用。递归确认编译器已经管理了一个堆栈,以精确地完成您所需的任务。当您开始管理您自己的功能时,您不仅可能重新引入您想要避免的函数调用开销,而且您还在重新发明一个已经以一种完全没有bug的形式存在的轮子(有足够的空间容纳bug)。

海事组织,只有在不需要堆叠的情况下,才能自然而容易地避免递归。(或其他非标量状态和/或范围管理结构)。

票数 16
EN

Software Engineering用户

发布于 2014-06-03 15:13:17

递归使用调用堆栈存储函数调用返回。函数状态存储在调用之间。

迭代还必须使用堆栈或一些类似的机制来存储中间状态,除非您自己创建堆栈。当然,除非您能够找到不需要这样的状态存储的替代算法。

只有当堆栈溢出时,递归才会更昂贵。从某种意义上说,迭代的代价会更高(在那些有助于递归的算法中),因为您正在重新创建递归已经提供的状态存储机制。

票数 5
EN

Software Engineering用户

发布于 2014-06-03 16:55:51

首先,虽然确实存在与任何递归算法等效的等效迭代,但对于“更好”的任何合理定义来说,并不一定是迭代等效更好。

对于某些算法,迭代等效只模拟递归算法,具有模拟的参数和局部变量的叠加和解叠加。考虑一下阿克曼函数。考虑一下赫夫曼编码。在这些情况下,(重新)编写显式堆栈操作几乎没有什么好处。

第二,不一定是递归总是比迭代更昂贵。想想尾递归,读一读"Lambda:终极.“论文。

(是的,我知道这需要扩大。我现在必须去看医生。)

好吧,有些事情可以说。

Tony最初是用迭代的方式描述快速排序的,他报告说这很难解释。递归解释,很简单。详细信息请参见哈斯克尔的快速排序。如果数组的长度等于1,则完成,否则,实际上必须对其进行排序。首先,选择一个枢轴元素。传统上,这是第一个元素,但任何元素都可以使用。接下来,对数组进行一次传递,形成三个子数组。第一个元素小于枢轴,第二个元素等于枢轴,第三个元素大于枢轴。(如果需要数组元素值是唯一的,则第二个子数组的长度等于一个。)现在加快排序第一个子数组,然后加快排序第二个子数组。

当递归出现时,二进制搜索最容易理解,实际上它是尾递归的.探测数组的中间元素。如果它等于您正在寻找的值,您就完成了。如果中间元素大于您所寻找的值,那么您知道所需的值必须位于“左边”,并且在中间元素之前搜索子数组,否则在中间元素之后搜索子数组。在这两种情况下,您都知道中间元素不是目标,所以忽略它。你要么找到你的目标,要么你没有数组去搜索。到了那个时候,你就会逃出去,你就完蛋了。在2014年,算了2019年,任何自重的编译器都知道如何进行尾部递归优化,甚至Java编译器也是如此。(注意:经典的Java虚拟机不支持一般尾调用优化,因为缺少一般的GOTO操作,但这不会影响尾递归优化。)

真正的问题,很多地方,是运行这个节目的人从来没有学习过尾部递归优化,所以他们禁止所有递归。我在北电网络上遇到了这个问题,我不得不写一整页的评论来解释它和一些相关的概念,并向他们展示汇编语言清单,这些清单证明编译器实际上并没有生成递归调用。北电现在已经走了,但是这些经理仍然存在于很多地方。

希望这能有所帮助。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/242889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档