Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归洗牌算法抛出堆栈溢出错误_Java_Algorithm_Recursion_Shuffle - Fatal编程技术网

Java 递归洗牌算法抛出堆栈溢出错误

Java 递归洗牌算法抛出堆栈溢出错误,java,algorithm,recursion,shuffle,Java,Algorithm,Recursion,Shuffle,这是Fisher-Yates shuffle的递归实现。当我将10000个条目作为输入时,为什么会抛出StackOverflow错误 public static void main(String[] args) { int[] array = algo3(10000); } public static int[] algo3(int n) { int[] a = new int[n]; for (int i = 0; i < a.length ; i++)

这是Fisher-Yates shuffle的递归实现。当我将10000个条目作为输入时,为什么会抛出StackOverflow错误

public static void main(String[] args)
{
    int[] array = algo3(10000);
}

public static int[] algo3(int n)
{
    int[] a = new int[n];
    for (int i = 0; i < a.length ; i++)
        a[i] = i;
    algo3(a, 0);
    return a;
}

public static void algo3(int[] a, int pos)
{
    if (pos == a.length - 1)
        return;
    int tmp = a[pos];
    int rand = randInt(pos,a.length); // line #27
    a[pos] = a[rand];
    a[rand] = tmp;
    algo3(a,pos + 1); // line #30
}

private static int randInt(int i, int j)
{
    return (int) (Math.random() * (j - i)) + i; // line #35
}

递归系统中的Fischer Yates将为数组中的每个成员执行一级洗牌

堆栈溢出将在10000级调用之前很久发生

为什么不能使用while循环版本,有什么特殊原因吗?它更简单、更快、更可靠。。。。。这是一个5线性算法。。。。作为一个循环


编辑。作为测试,我写了以下内容:

private static final void recurse(int val) {
    System.out.println(val);
    recurse(val + 1);
}
public static void main(String[] args) {
    recurse(1);
}

猜猜我是从哪里得到溢出异常的?啊,从来没有!我猜我的JIT将其编译为循环而不是递归,我在“1816130”之后的某个地方终止了该进程。

递归系统中的Fischer Yates将为数组中的每个成员执行一个级别的洗牌

堆栈溢出将在10000级调用之前很久发生

为什么不能使用while循环版本,有什么特殊原因吗?它更简单、更快、更可靠。。。。。这是一个5线性算法。。。。作为一个循环


编辑。作为测试,我写了以下内容:

private static final void recurse(int val) {
    System.out.println(val);
    recurse(val + 1);
}
public static void main(String[] args) {
    recurse(1);
}

猜猜我是从哪里得到溢出异常的?啊,从来没有!我猜我的JIT将其编译为循环而不是递归,我在“1816130”之后的某个地方终止了该进程。

10000是一个很大的数字,特别是因为您正在处理一个10000个元素的数组。您可以使用
-Xss
JVM参数来调整堆栈的大小。

10000是一个很大的数字,特别是因为您正在处理一个10000个元素的数组。您可以使用
-Xss
JVM参数来调整堆栈的大小。

您可以调整堆栈的大小,但真正要做的是将上限提高一点,而不是完全移除上限。您可以调整堆栈的大小,但真正要做的是把天花板抬高一点,而不是完全拆除天花板。