lei*_*ero 7 java recursion performance stack
这个问题的基础:
今年夏天我将获得CS学位,而不是曾经有一位教授强调Stack的重要性.但是,我有多个项目都专注于递归的使用.我发现递归很有用而令人兴奋,我在个人项目中经常使用它.
我最近去了一个面试,面试官对他们的问题的递归解决方案非常失望.他们想要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 + " ");
}
}
}
Run Code Online (Sandbox Code Playgroud)
两种解决方案都在大约200毫秒内完成 x通过添加零来改变值:x = 100000给我一个StackOverflowError(在递归方法上).
当我注释掉x程序的SAME值的递归解决方案成功运行时,意味着Stack解决方案远远超出了递归解决方案的限制.
问题
Pet*_*rey 12
为什么递归解决方案产生的StackOverflowError具有与Stack解决方案相同的迭代次数,但Stack解决方案不会出错?
递归使用您的线程堆栈,并且具有更低的限制.STack使用堆,这个更大但最终会出现OutOfMemoryError.
如果Stack解决方案更强大并且使用更少内存,您何时会使用递归解决方案?
它更慢,更难编写,更容易出错并且使用更多内存.只是限制要高得多.
我看到很多人在Stacks上使用递归,这是因为递归"更容易",虽然效率低得多?(3行代码与本例中的7行).
你还没有预热代码来说哪个更有效率.我会忽略前10,000次迭代或第一次运行时间.
虽然我知道你不能说为什么其他人都使用递归,
通常递归的效率低于使用迭代的效率,但是使用递归时不能轻易地重构某些问题.使用Java中的迭代,95%的问题更有效.
我想质疑它的使用而不是使用它,因为"如果没有充分的理由,其他人都会这样做".
大多数时候人们使用递归,因为它更简单,更快,但它可以用尽堆栈空间,并且在极少数情况下你必须使用Stack或ArrayList,它比Stack更有效.
| 归档时间: |
|
| 查看次数: |
4726 次 |
| 最近记录: |