【问题标题】:Java Stackoverflow Error RecursionJava Stackoverflow 错误递归
【发布时间】:2013-05-12 00:00:42
【问题描述】:

我编写的这段代码在输入一定大小之前效果很好。如果输入太大,我会得到“java.lang.StackOverflowError”。我已经阅读了有关此主题的 stackoverflow 上的其他一些条目,并且我认为我的递归出现错误 - 但我找不到它。 代码如下:

public int partition(int[] A, int l, int r, int x){

    int i = l-1;
    int j = r;
    int exchange;

    while(i <= j){
        while(A[i] > x){
            i++;
        }

        while(j >= i && A[j] <= x){
            j--;
        }

        if(i < j){
            exchange = A[i];
            A[i] = A[j];
            A[j] = exchange;
        }
    }

    if(A[i] < A[r]){
        exchange = A[i];
        A[i] = A[r];
        A[r] = exchange;
    }

    return i;
}

public void quicksort(int[] A, int l, int r){
    int pivot = 0;
    int x = 0;

    if(l < r){
        x = A[r];
        pivot = partition(A, l, r, x);
        quicksort(A, l, pivot-1);
        quicksort(A, pivot+1, r);
    }
}

【问题讨论】:

  • 输入必须有多大才能获得 stackoverflow?
  • 您是发布此问题的同一个人吗:stackoverflow.com/questions/16496233/… ..您不应该尝试自己做作业吗?
  • 在调试器中单步执行代码时会看到什么?如果您的代码中有错误,那么您应该首先尝试调试器。
  • java.lang.StackOverflowError 出现在您分配过多内存“堆栈”的位置,因此您可能在某处存在无限循环。
  • @mrhobo 他们看起来不一样......这只是 Java 101 学期的那一周 :)

标签: java recursion stack-overflow


【解决方案1】:

如果输入太大

“太大”到底是什么意思? 每个足够深的递归都可能导致堆栈溢出,因为堆栈用于将递归方法的所有局部变量保留在所有递归级别上。

这是递归的固有缺点,也是迭代实现通常优于递归的原因。

【讨论】:

  • hmm...100 个元素正在工作。从大约 1000 起,它不再起作用了
  • 但我想处理大约 1000k 个元素。所以你会建议尝试迭代方式?
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
相关资源
最近更新 更多