如何递归地将文件中的元素插入到数组中? -java -

时间:2015-04-27 18:56:29

标签: java recursion

我一直试图将这个问题弄清楚一段时间,并且无法找到解决方案。我需要做的是将文件中的元素插入到数组递归中。我意识到只需一个循环就可以轻松完成,但由于这是作业,因此必须以递归方式完成。我想在正确的方向上提示一下。我在理解递归方面遇到了很多麻烦,所以任何帮助都会很好。真正让我困惑的部分是如何将元素实际放入数组中。以下是我到目前为止的情况:

 import java.util.*;
 import java.io.*;


public class Recursion{

 public static void main(String[]args) throws FileNotFoundException{

  int i= 0;
  int findInts = 0;
 // reading file
  Scanner scan = new Scanner(new File("heap.dat"));
  // finding ints in file
   while(scan.hasNextInt()){
      findInts = scan.nextInt();
       array(findInts);

  }

 }

 public static void array (int findInts) throws FileNotFoundException{
  int[] numbers = new int[1000]; // my array must have 1000 elements

   if(findInts == 0){
   System.out.println();
   }
   else{
   // Im really not sure what to do here
   // this gives me the infinite recursion error
   array(findInts);

   }


 }

2 个答案:

答案 0 :(得分:0)

任何递归解决方案都需要一个基本案例来决定何时终止递归。如果缺少这个,您将获得无限递归。以下是与您的案例相关的示例:

void addToArray(Scanner scan, int[] numbers, int index){
    if (scan.hasNextInt()){
        addToArray(scan, numbers, index++); //recursive case
    } else {
        return; //stop recursion
    }
}

注意我故意遗漏了你需要在数组中添加数字的部分。由于这是一个家庭作业,我会让你搞清楚;)

答案 1 :(得分:0)

首先,尝试将递归方法命名为" array"。一个函数应该暗示它的作用。在这种情况下" recursiveInsert"是一个不错的选择。另外,在方法之外声明你的数组。

我还要补充说,递归有一个"基本情况"你实际执行操作的地方(返回一个值,或者在这种情况下插入一个新的数字)和一个"归纳步骤"用新参数再次调用函数的地方(记住,必须始终使用相同的类型。

对于您的情况,看起来您将要有一个已排序的数组。您需要一个ALGORITHM以排序顺序插入这些元素。算法只是解决问题的一种方法。

这是一个提出的算法(它将以log(N)的顺序具有快速运行时间): 查找"二分搜索" BINARY SEARCH 基本上,你检查列表的中间(长度/ 2)。如果它更大,再次检查列表的下半部分并限制开始和结束索引,如果它更小则检查上半部分。

您将更改方法的签名以接受开始和结束索引。

这里有一些代码可以帮助您入门......



import java.util.*;
import java.io.*;


public class Recursion{

public static void main(String[]args) throws FileNotFoundException{

  int i= 0;
  int findInts = 0;
  int [] array = new int[1000]//DECALRE YOUR ARRAY OUTSIDE METHOD 
 // reading file
  Scanner scan = new Scanner(new File("heap.dat"));
  // finding ints in file
   while(scan.hasNextInt()){
      findInts = scan.nextInt();
       Recursive(findInts, 0, 1000, array);

  }

 }

//insertMe is the num to insert, start and end are the indices
//note that the array is passed to the method
 public static void recursiveInsert(int insertMe, int start, int end, int[] array) throws FileNotFoundException{
   //BASE CASE
   if(start <= end - 1) {
   //insert the value at the index by copying the lower and upper halves into other arrays
   //and "move" the upper values over to make space.
   }
   //check the index to see if it fits
   if(array[end / 2] > InsertMe) { //check the middle point
      recursiveInsert(insertMe, start, end / 2, array); //result is that the middle point was greater
   }                                              //so, recursively try again in lower-half

 //DO OTHER CODE THINGS HERE

 }
&#13;
&#13;
&#13;