Java堆栈和递归

问题描述 投票:1回答:2

我的问题是关于Java堆栈的设计。是否考虑了递归设计,或者由于堆栈的结构,递归成为一种东西?

java recursion design-patterns stack history
2个回答
1
投票

一个截然不同的答案:

实际上,递归的“真实的东西”是tail recursion,编译器认识到这一点,并在封面下将其优化为迭代循环。

而且意外的是:你没有用Java获得它。因此,在现实世界中,递归和Java不能很好地结合在一起。只有几千个递归调用可能会导致JVM崩溃。所以你绝对试图避免在真正的java中递归。对于小的孤立问题来说这是一件很好的事情。但除此之外,递归在Java中“不是”一件事。

并且堆栈的设计可能更基于20年前为虚拟机创建简单易用的端口系统的想法。在Java v1发布之前,这两个概念(堆栈和递归)都存在很久。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.