递归麻烦

时间:2012-04-01 01:17:29

标签: java recursion

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Collections;
import java.util.List;

public class TennisTournament {

  public static void main (String [] args) {
    Scanner input = new Scanner(System.in);
    ArrayList <Integer> nums = new ArrayList<Integer>();
    while (input.hasNextInt()) {
      nums.add(input.nextInt());
    }
    System.out.println(nums);
    tournament(nums);
  }

  public static void tournament(ArrayList <Integer> list) {
    int midPoint = list.size()/2; // returns the index number of half of the lists size
    int midPoint2 = list.size()/2;
    if (list.size() != 1 || midPoint != 1) {
      for (int i = 0; i < midPoint2; i++) { // while is bigger than mid point, increment by one
        if (list.get(i) < list.get(midPoint)) {
          Collections.swap(list, i, midPoint);
        }
        midPoint++;
      }
      System.out.println(list);
      int newPoint = midPoint2/2;
      midPoint2 = newPoint;
    }
    tournament(list);

  }
}

好吧,所以我对递归的想法很新,现在,我得到的只是一个无限循环。所以在第一种方法中,我想通过将数字除以一半来分析数组,并将数组前半部分的第一个元素与数组后半部分的第一个元素进行比较,如果第二个元素是更大,然后交换这一切都很好,它正在做我想要它做的事情。 [3,5,8,2,1,7,6,4] [3,7,8,4,1,5,6,2] 我想采取的下一步是我只想要我正在努力的一半元素。所以在第一个例子中,我想要的是我工作的元素数量的一半,所以不是0-list.size,我希望它在0-list.size()/ 2上工作,所以它只会交换前两个数字,然后在2个数字上再次执行,直到中间点变为1。 只需要了解一下如何实现这一目标就会很棒。 不,不是作业。

2 个答案:

答案 0 :(得分:2)

当列表大小小于2时,我猜你需要停止拆分。

答案 1 :(得分:0)

tournament(list);调用替换为对半长的子列表的两次递归调用(使用List.subList(...))。如果列表长度为1,则快捷键。