2012-04-01 205 views
1
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

我很想將其標記爲家庭作業。是嗎? – 2012-04-01 01:22:32

+0

遞歸的「結束條件」是什麼?就目前來看,無論它只是將原始未修改列表中的「錦標賽()」永久地稱爲它,似乎都是如此。它從來沒有用較小的列表調用,也沒有任何東西阻止遞歸調用。 – 2012-04-01 01:22:47

+0

@Brandon:注意問題的最後一行:_不,不是作業._ :) – sarnold 2012-04-01 01:27:14

回答

2

我猜你需要停止分裂,當列表尺寸小於2

0

與半長的子列表兩個遞歸調用(使用List.subList(...))更換tournament(list);電話。然後,如果列表的長度爲1,則快捷方式。