当前位置: 首页 > 知识库问答 >
问题:

什么是递归,什么时候应该使用它?

韦德厚
2023-03-14

邮件列表和网上讨论中似乎经常出现的一个话题是攻读计算机科学学位的优点(或不足)。对于否定的一方来说,一个似乎一再出现的论点是,他们已经编码了一些年了,他们从来没有使用过递归。

所以问题是:

  1. 什么是递归?
  2. 何时使用递归?
  3. 为什么人们不使用递归?

共有1个答案

邢凌
2023-03-14

在本文中对递归有很多很好的解释,这个答案是为什么您不应该在大多数语言中使用它。*在大多数主要的命令式语言实现中(即C、C++、Basic、Python、Ruby、Java和C#的每个主要实现),迭代要比递归好得多。

要了解原因,请遍历上述语言用于调用函数的步骤:

  1. 在堆栈上为函数的参数和局部变量腾出空间
  2. 函数的参数被复制到这个新空间
  3. 控件跳转到函数
  4. 函数代码运行
  5. 函数的结果被复制到返回值
  6. 堆栈将重新卷绕到其上一个位置
  7. 控件跳回到调用函数的位置

执行所有这些步骤都需要时间,通常比循环迭代要多一点。然而,真正的问题在第一步。当许多程序启动时,它们会为堆栈分配一个内存块,而当这些内存耗尽时(通常,但不总是由于递归),程序会因堆栈溢出而崩溃。

因此,在这些语言中,递归的速度较慢,它使您很容易崩溃。但使用它仍有一些争论。一般情况下,当您知道如何阅读时,递归编写的代码更短,也更优雅。

有一种技术,语言实现者可以使用被调用的尾部调用优化,可以消除堆栈溢出的一些类。简明扼要地说:如果函数的返回表达式只是函数调用的结果,那么您不需要在堆栈中添加新的级别,您可以为被调用的函数重用当前的级别。遗憾的是,很少有命令式语言实现内置尾调用优化。

*我喜欢递归。我最喜欢的静态语言根本不使用循环,递归是重复做某事的唯一方法。我只是不认为递归通常是一个好的想法,在语言没有调优它。

**顺便说一下,Mario,ArrangeString函数的典型名称是“join”,如果您选择的语言还没有它的实现,我会很惊讶。

 类似资料:
  • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

  • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

  • 最近,我收到了在代码中使用's的建议,或者在站点上看到了一些使用's的答案--应该是某种容器。但是--我在C++17标准库里找不到类似的东西。 那么这个神秘的是什么?如果它是非标准的,为什么(或何时)使用它是个好主意?

  • 问题内容: 在集成我以前从未使用过的Django应用程序时,我发现了用于定义类中函数的两种不同方式。作者似乎非常有意地使用了它们。第一个是我自己经常使用的: 另一个是我不使用的,主要是因为我不知道何时使用它,以及什么用途: 在Python文档中,装饰器的解释如下: 类方法将类作为隐式第一个参数接收,就像实例方法接收实例一样。 所以我想指的是自己(而不是实例)。我不完全理解为什么会这样,因为我总是可

  • 问题内容: 在以下代码段中: 是什么在方法代表什么呢?我什么时候应该使用它? 问题答案: 介绍 该ServletContext#getRealPath()被intented到Web内容的路径(在服务器的磁盘文件系统上展开的WAR文件夹结构的路径)转换为绝对磁盘文件系统路径。 该代表Web内容根。即,它代表以下项目结构中的文件夹: 因此,将传递给将返回你/web项目的扩展WAR文件的文件夹的绝对磁盘

  • 问题内容: 我看过各种文章,但我仍然不知道为什么不应该使用它。请让我知道您的想法。 问题答案: 我发现有必要在错误的设计中使用instanceof提示。可以肯定的是,将会出现一个大型,复杂的开关风格的构造。在我看到的其他大多数情况下,我们应该使用多态而不是instanceof。请参阅策略模式。(相关的使用示例) 我唯一需要使用的是实现时。