java - 即使它没有优化尾递归,我是否应该在java中使用尾递归

标签 java recursion tail-recursion

在网上阅读后,我发现java并没有优化尾递归。 那么,如果头递归和尾递归会产生相同的结果,那么使用它还有什么意义吗?

此外,循环的性能总是比递归(尾部和头部)更好吗?因为有时使用递归而不考虑迭代会更容易。 请告诉我是否应该使用循环。

由于我刚刚开始使用递归,如果我错了,请纠正我。

最佳答案

是的,java中任何递归算法的性能几乎总是比使用循环重写相同的算法要差得多。使用循环通常总是那么简单:

  • 创建一个堆栈或双端队列对象。
  • 创建一个代表所有相关状态的类。
  • 编写一个循环,从堆栈或双端队列中获取内容并对其进行操作。
  • 作为“操作”的一部分,您可以自由地从事新工作 - 类似于给自己打电话。

该“公式”应该适用于任何递归算法。

但是,您编写的绝大多数代码在性能方面并不重要。毫不夸张地说,如果您的应用对 CPU 产生任何可测量的影响,那么您的应用所使用的 99% 的 CPU 资源几乎总是被整个代码库的 0.1% 所使用。

接下来的工作显然就是 [A] 发现 0.1% 和 [B] 可以提高效率。

剩下的 99.9% 根本不重要。这不是“千刀万剐”的情况——这真的不重要。你可以编写比实际效率低 10 到 100 倍的代码,即使你犯了很多次这样的错误,只要它不在那个 0.1% 的关键路径中,你就永远不会注意到,也不会您的用户会。

因此,从这个意义上说,如果您认为使用递归会更容易编写代码并且更容易阅读代码,那么请让自己崩溃。只需知道,如果您的探查器告诉您此递归算法在那 0.1%(关键路径)中,是的,步骤 1:重写远离递归。

旁注:只要不递归得太远,JVM 就可以进行相当多的优化。有些虚拟机(例如 azul)甚至会消除一堆重复的堆栈跟踪(递归算法具有重复的堆栈跟踪)。因此,即使是 Java 中的递归算法,在性能方面也可以很好。只是可靠地获得此结果要困难得多,因为您现在依赖于自定义 VM 实现中所做的优化。

关于java - 即使它没有优化尾递归,我是否应该在java中使用尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68530296/

相关文章:

java - 用户字符串输入验证和异常错误

java - 递归求包括负数在内的数字之和

c - Dec 到 bin 转换器函数向后打印结果

f# - 递归计算表达式

java - 将音频流转换为 PCM

java - 实体表不是使用 JPA 2.1 创建的

xml - XSLT:基于 2 个子元素的元素的数学加法

prolog - 将两个列表附加在一起的 Prolog 算法的解释

performance - 尾递归和 Seq 库之间的 F# 性能差异

java - 从 Blackberry 设备发送短信问题