Java 用递归方法求解stackoverflowException

Java 用递归方法求解stackoverflowException,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,我已经为我的作业写了一个方法,用递归计算整数数组的所有排列。(我正在尝试实现回溯算法)。但是它会导致StackOverflowException计算超过7个数字的前置。我不知道如何解决这个问题。如果我使用itration,它是否仍然实现回溯 代码: 假设您的算法是正确的,并且对7个数字正确工作 那么您可能需要更多的堆栈空间。这可以通过在Java命令行中添加“-Xss1024k”来实现,该命令用于1兆堆栈大小。你可以增加更多的空间。这样做可能会给你你所需要的 然而,您必须理解,堆栈空间总是有一个上

我已经为我的作业写了一个方法,用递归计算整数数组的所有排列。(我正在尝试实现回溯算法)。但是它会导致
StackOverflowException
计算超过7个数字的前置。我不知道如何解决这个问题。如果我使用itration,它是否仍然实现回溯

代码:


假设您的算法是正确的,并且对7个数字正确工作

那么您可能需要更多的堆栈空间。这可以通过在Java命令行中添加“-Xss1024k”来实现,该命令用于1兆堆栈大小。你可以增加更多的空间。这样做可能会给你你所需要的


然而,您必须理解,堆栈空间总是有一个上界,递归算法可能会碰到这个上界。您最好使用不同的算法,不使用调用堆栈来存储您需要执行的工作。有时,最好使用堆空间,而不是使用队列或堆栈类的实例来保存状态。

我的解决方案有14行代码。也许你应该重新考虑你的方法

提示:您实际上不需要单独的列表来保存当前排列,您可以直接排列(和取消排列)数组。这意味着您不需要任何代码来检测列表中的重复项

但你的问题可能更基本。维基百科:

递归函数定义具有 一个或多个基本情况,即 函数所针对的输入 产生微不足道的结果(没有 循环),以及一个或多个递归 案例,指的是 程序递归(调用自身)。对于 例如,阶乘函数可以是 由方程递归定义 0! = 1,对于所有n>0,n!=n(n− 1)!. 这两个方程本身都不是 构成一个完整的定义;这个 第一个是基本情况,第二个是 是递归的情况。委员会的工作 递归案例可以看作是 将复杂的输入分解为 简单的。以适当设计的方式 递归函数,每个 递归调用时,输入问题必须解决 以这样一种方式简化 最终,基本情况必须是 达到


(我的重点)。我看不到有人试图保证能达到
I==arr.length
。有时候我在递归时变小了,有时候它变大了,很可能它只是简单地振荡而没有达到基本情况。换言之,您的程序永远不会终止,但由于每个递归步骤都需要额外的内存,因此堆栈空间不足。

解决方案是否需要使用递归?关键数据段位于堆栈跟踪的较低位置。编辑您的文章并包括整个堆栈trace@Bernard:不,这不是必需的,但因为我想实现回溯,所以我使用了递归。是的,总是有一个上界,但对于这个问题,任何合适的算法都需要堆栈空间在数组长度上是线性的,但执行时间是指数的(因为输出具有指数大小)。换句话说,如果您提供的输入中,适当的算法将达到堆栈大小限制,则整个世界将在算法终止之前结束。@meriton-忽略此特定示例,我宁愿为队列或堆栈的实例分配10MB,然后必须存储相等数量的调用堆栈帧,每个帧都将更大递归是优雅的,通常是一个有趣的家庭作业问题,但在我看来很少是最好的解决方案。显然,递归并不适合所有问题。但它是合适的,甚至是最好的,我可以想象,在这里。
solve(0, arr, currentS);
//****************

private static void solve(int i, ArrayList<Integer> arr, int[] currentS) {
    if (i == arr.size()) {
        for (int j : currentS) {
            System.out.print(j + ",");
        }

        System.out.println();

        currentS[i-1] = 0;
        solve(i - 2, arr, currentS);

    } else {
        int x = nextValue(i, currentS, arr);
        if (x != -1&&travers.isCompatible(arr, currentS.clone())) {
            currentS[i] = x;
            solve(i + 1, arr, currentS);
        }
        else if((i != 0))
        {
            currentS[i] = 0;
            solve(i - 1, arr, currentS);
        }
    }
    return;
}
Exception in thread "main" java.lang.StackOverflowError
    at java.util.ArrayList.get(Unknown Source) ....