【问题标题】:Why use recursion? [duplicate]为什么要使用递归? [复制]
【发布时间】:2013-12-18 09:16:09
【问题描述】:

我想知道,为什么人们使用递归?在我的大部分学习经验中,我发现它比迭代方法效率低得多,那么人们为什么要使用它呢?是因为你可以简单地写一个更短的方法吗?它是否用于课堂环境(或学习目的)之外的现实世界编程?如果是,请提供一个很好的例子,我很好奇。

提前感谢您的帮助!我真的很感激!

【问题讨论】:

标签: performance recursion iteration


【解决方案1】:

嗯,一方面,它用于函数式编程语言(如 Haskell)中,这些语言实际上没有迭代,并且针对递归进行了优化。此外,对于某些问题(例如使用二叉树),递归是一种非常自然且干净的解决方案。

【讨论】:

    【解决方案2】:

    如果您有一个树数据结构并且您想以深度优先的顺序遍历它,那么递归是实现它的唯一方法。

    如果您想为具有上下文无关规则的典型语言编写解析器,就像现有的每种编程语言一样,递归下降解析器是一种简单而自然的方法。 在存储空间有限的情况下,没有迭代方法。

    【讨论】:

    • 递归不是唯一的方法——它只是解决问题的最简单、最自然的方法。但是,使用堆栈的迭代方法也可以。
    • @Trenin:使用堆栈的迭代方式递归。
    • @MikeDunlavey - 如果它只使用常规堆栈数据结构,而不是调用堆栈,那么我不会调用该递归。
    • @MikeDunlavey:真正的递归隐式使用调用堆栈。数据递归显式使用自己的堆栈。这是有区别的,特别是在那些不能很好地进行真正递归的语言中——它们中的大多数可以整天进行数据递归。
    • 不过,您甚至都不需要 堆栈。这是最自然的解决方案,但不是唯一的解决方案。想象一个双向链表,其中每个节点都有一个expanded 标志。从只包含根的列表开始。当您浏览列表时,如果您看到一个尚未展开的节点,并且它有任何子节点,请在当前节点之前插入子节点,设置当前节点的 expanded 标志,并将迭代器向后移动,以便孩子将是下一个处理的节点。否则,处理该节点并将迭代器向前移动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2022-11-21
    • 1970-01-01
    • 2013-09-18
    • 2012-09-12
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多