Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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_Recursion_Stack Overflow_Linear Search - Fatal编程技术网

Java 运行递归线性搜索时获取堆栈溢出错误

Java 运行递归线性搜索时获取堆栈溢出错误,java,recursion,stack-overflow,linear-search,Java,Recursion,Stack Overflow,Linear Search,我意识到二进制搜索会更有效率,我甚至有一个可以工作,但我需要为实验室编写递归线性搜索。 我在方法linSearch上不断得到堆栈溢出,特别是在第33行 我需要搜索1280000大的数组 import java.util.Scanner; public class linSearch { public static void main(String[] args){ Scanner in = new Scanner(System.in); System.

我意识到二进制搜索会更有效率,我甚至有一个可以工作,但我需要为实验室编写递归线性搜索。 我在方法linSearch上不断得到堆栈溢出,特别是在第33行

我需要搜索1280000大的数组

import java.util.Scanner;
public class linSearch {    
    public static void main(String[] args){
       Scanner in = new Scanner(System.in);
       System.out.println("enter size");
       int size = in.nextInt();
       System.out.println("enter numb");
       double numb = in.nextDouble();
       double [] array = new double[size];
       for(int i = 0; i < 30; i++){
          for(int j = 0; j < size-1; j++){
              double random = (int)(Math.random() * 1000000);
              array[j] = (double)(random / 100);
          }
          int position = linSearch(array, numb, 0);
          if(position == -1){
              System.out.println("the term was not found");
         }
        else{
            System.out.println("the term was found");
        }
    }
}
public static int linSearch(double[] array, double key, int counter){
    if(counter == array.length){
        return -1;
    }
        if(array[counter] == key){
            return counter;
        }
        else{
            counter += 1;
            return linSearch(array, key, counter);  //error occurs here
        }
    }
}

如果堆栈能够容纳15000个对自身的交互调用,那么您就很幸运了,更不用说128000了 但是,如果您已经验证了递归的实现是正确的,那么您可以增加堆栈的大小,以便允许更多的调用。根据安装的Java虚拟机JVM,默认线程堆栈大小可能等于512KB或1MB

但是,可以使用-Xss标志增加线程堆栈大小。可以通过项目的配置或命令行指定此标志


希望这有帮助

您的堆栈不够大,无法容纳1280000个堆栈帧。您需要编写算法的迭代版本或实现二进制搜索。二进制搜索只需要堆栈log21280000=20帧深。线性搜索对于递归解决方案来说是一个非常糟糕的候选者。如果需要处理像您所说的那么大的输入,那么您不太可能以这种方式编写工作程序。执行迭代线性搜索。谢谢你的回答,但问题是这个实验室需要递归线性搜索,我不能很好地解决这个问题,除了需要有序输入的二进制搜索。。。请注意,许多非更新递归算法(如搜索)可以稍微并行化。我假设在获得n帧深度后,它会变成非递归版本,在分而治之的方法中,我感觉这就是@axblount真正的意思。在x是可用处理器数量的情况下,您只能并行处理大约2x+1个任务,所以请深入到这个程度,或者直到有8个元素需要搜索。“哦,你可能也会发现打破主要方法是值得的。”发条工缪斯说,“我认为他应该使用悬挂的for循环。”。