微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决即使没有优化尾递归,我是否应该在 java 中使用尾递归

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

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

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

解决方法

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

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

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

但是,您编写的绝大多数代码在性能方面都无关紧要。毫不夸张地说,如果您的应用对 CPU 产生了任何可衡量的影响,那么几乎总是您的应用消耗的 99% 的 CPU 资源被整个代码库的 0.1% 用完。

任务是很明显 [A] 发现 0.1% 和 [B] 使它更有效率。

剩下的 99.9% 无所谓。这不是“千刀万剐”的情况——这真的无关紧要。您可以将代码编写的效率降低 10 到 100 倍,即使您犯了很多次这样的错误,只要它不在 0.1% 的关键路径上,您就永远不会注意到,也不会你的用户会吗。

因此,从这个意义上说,如果您认为使用递归更容易编写代码并且更容易阅读,那么请放弃。请注意,如果您的分析器告诉您该递归算法在 0.1%(关键路径)中,是的,请执行第 1 步:远离递归进行重写。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。