将递归函数抛出StackOverflowError

时间:2016-03-06 05:32:40

标签: function recursion

我有一个自己调用的代码(java)..当它没有得到一些值时。

public void recfunction() {
    ---do something----
    if not found a then
    call recFunction();
    if found a save a and then exit the function.
}

recfunction本身最多可调用5次。我得到了" a" 5次以内。如果我运行此函数1000次,我会得到StackOverflowError吗?

编辑:我想问的是当函数退出时......将删除所有调用的Stack帧。

3 个答案:

答案 0 :(得分:0)

你可以尝试并发现,但不是,只要它正在执行实际代码并保持在堆栈限制内,它就不会。 java中的堆栈大小是400k,所以只要你没有在每次调用中跟踪大量的varas就应该没问题。

如果它在投掷stackoverflower之前只运行了5次,那是因为你超过了堆栈。

答案 1 :(得分:0)

您问题的具体答案是,"它取决于。"

但总的来说,是的,运行amok的递归函数会导致堆栈溢出错误。

特别是在Java中,您可以控制堆栈大小。因此,您可以使用更小或更大的堆栈启动JVM,这显然会影响堆栈溢出的数量。

此外,您在函数中分配的本地存储量将有所贡献。如果你的函数根本不使用任何堆栈 - 只需调用自身并可能递减一个计数器 - 你将不得不使用只有返回地址指针和基本堆栈帧数据的堆栈。 / p>

但是如果在每个本地堆栈帧中分配一个1000个元素的对象数组,那么显然你将消耗更多的堆栈"每个调用",因此你可以用更少的递归级别溢出堆栈。

答案 2 :(得分:0)

首先,该代码显然不会编译,更不用说运行......

其次,假设它已编译,你可以编译并运行它。

最重要的是,如果您要在多个配置上运行它,您会发现不同的答案。例如,请参阅this question

java -Xss4m Test

这会将堆栈大小增加到4兆字节。