递归与堆栈实现。为什么递归返回 StackOverflow 而 Stack 不返回?
这个问题的依据:
我今年夏天将以CS学位毕业,没有一次我有一个教授强调Stack的重要性。但是,我有多个项目都专注于递归的使用。我发现递归有用且令人兴奋,我在我的个人项目中经常使用它。
我最近参加了一次求职面试,面试官对问题的递归解决方案感到非常失望。他们想要堆栈解决方案。我做了一堆研究,但我仍然不确定何时使用哪个。
给出以下演示:
public class TestCode {
static long startTime = 0;
static long stopTime = 0;
static long totalTime = 0;
public static void main(String[] args) throws IOException {
int x = 10000;
startTime = System.currentTimeMillis();
recursiveMethod(x);
System.out.println();
stopTime = System.currentTimeMillis();
totalTime = stopTime - startTime;
System.out.println(totalTime);
System.out.println();
startTime = System.currentTimeMillis();
stackMethod(x);
System.out.println();
stopTime = System.currentTimeMillis();
totalTime = stopTime - startTime;
System.out.println(totalTime);
}
public static void recursiveMethod(int a){
if(a >= 0){
recursiveMethod(a - 1);
System.out.println("Recursion: " + a + " ");
}
}
public static void stackMethod(int a){
Stack<Integer> myStack = new Stack<Integer>();
while(a >= 0){
myStack.push(a);
a--;
}
while(myStack.isEmpty() == false){
a = myStack.pop();
System.out.println("Stack: " + a + " ");
}
}
}
两种解决方案在大约200 ms内完成。通过添加零来更改 的值:给我一个StackOverflowError(在递归方法上)。x
x = 100000
当我注释掉具有相同值的程序的递归解决方案时,成功运行,这意味着Stack解决方案的工作远远超出了递归解决方案的限制。x
问题
- 为什么递归解决方案生成的 StackOverflowError 具有与 Stack 解决方案相同的迭代次数,而 Stack 解决方案没有出错?
- 如果 Stack 解决方案功能更强大且使用的内存更少,您何时会使用递归解决方案?
- 递归和堆栈/迭代解决方案之间的根本区别是什么,在选择一个之前必须考虑一个?