我的问题是关于Java堆栈的设计。是否考虑了递归设计,或者由于堆栈的结构,递归成为一种东西?
一个截然不同的答案:
实际上,递归的“真实的东西”是tail recursion,编译器认识到这一点,并在封面下将其优化为迭代循环。
而且意外的是:你没有用Java获得它。因此,在现实世界中,递归和Java不能很好地结合在一起。只有几千个递归调用可能会导致JVM崩溃。所以你绝对试图避免在真正的java中递归。对于小的孤立问题来说这是一件很好的事情。但除此之外,递归在Java中“不是”一件事。
并且堆栈的设计可能更基于20年前为虚拟机创建简单易用的端口系统的想法。在Java v1发布之前,这两个概念(堆栈和递归)都存在很久。
Java8添加了lambda表达式和功能接口,如下所述:https://blog.knoldus.com/tail-recursion-in-java-8/
这允许我们定义自己的尾递归接口:
@FunctionalInterface
public interface TailCall {
TailCall apply();
default boolean isComplete() {
return false;
}
default T result() {
throw new Error("not implemented");
}
default T invoke() {
return Stream.iterate(this, TailCall::apply)
.filter(TailCall::isComplete)
.findFirst()
.get()
.result();
}
}
所以你可以这样做:
public class Factorial{
public static TailCall factorialTailRec(final int factorial, final int number) {
if (number == 1)
return TailCalls.done(factorial);
else
return call(() -> factorialTailRec(factorial * number, number - 1));
}
}
但是,Java原本没有任何尾递归优化。与Scala(我认为更好的Java)相比,Scala具有@tailrec
注释,因此当提供此提示并且假定该函数是真正的tailrec函数时,编译器将优化递归为非递归方式。
@tailrec
def gcd(a: Int, b: Int): Int = …
请在此链接中查看更多详细信息:https://www.scala-exercises.org/scala_tutorial/tail_recursion