Tag: recursion

为什么最大递归深度我可以达到非确定性?

我决定尝试一些实验,看看我能发现堆栈帧的大小,以及当前执行代码在堆栈中的距离。 我们可能会在这里调查两个有趣的问题: 当前代码的深度是多少级别? 当前方法遇到StackOverflowError之前可以达到多少级别的递归? 堆栈当前执行代码的深度 这是我能想到的最好的: public static int levelsDeep() { try { throw new SomeKindOfException(); } catch (SomeKindOfException e) { return e.getStackTrace().length; } } 这看起来有点黑客。 它生成并捕获exception,然后查看堆栈跟踪的长度。 不幸的是,它似乎也有一个致命的限制,即返回的堆栈跟踪的最大长度为1024.除此之外的任何内容都被削减,因此此方法可以返回的最大值为1024。 题: 有没有更好的方法做到这一点,不是那么hacky并没有这个限制? 对于它的价值,我的猜测是没有: Throwable.getStackTraceDepth()是一个本机调用,它建议(但不能certificate)它不能用纯Java完成。 确定我们剩下多少递归深度 我们可以达到的等级数量将由(a)堆栈帧的大小和(b)剩余堆栈量确定。 让我们不要担心堆栈帧的大小,只需看看在我们遇到StackOverflowError之前我们可以达到多少级别。 这是我执行此操作的代码: public static int stackLeft() { try { return 1+stackLeft(); } catch (StackOverflowError e) { return 0; } } 它的工作令人钦佩,即使它在堆栈剩余量方面是线性的。 […]