2016-12-05 8 views
0

, поэтому я довольно близко разбираюсь в этом алгоритме. Это часть другого более длинного алгоритма, я просто сделал это, чтобы найти все возможные упорядоченные комбинации целых чисел в ArrayList.Написание комбинаций Рекурсивно используя ArrayList из целых чисел в Java

У меня есть ArrayList целых чисел {0, 1, 2}. Я хочу эффективно использовать рекурсию для решения этой проблемы, используя метод member permute(). У меня есть оригинальный ArrayList {0, 1, 2} и используйте ArrayList preArr, чтобы заполнить его один за другим с помощью помощника ArrayList до тех пор, пока preArr не заполнит элементы, а затем попробуйте очистить оба preArr и помощника, чтобы пополнить новую комбинацию.

public class ArrayPermutation { 

    ArrayList<Integer> arr = new ArrayList<>(); 

    public ArrayPermutation(int N) { 
     for (int i = 0; i < N; i++) { 
      arr.add(i); 
      //System.out.println("Arr at index " + i + " ===> " + arr[i]); 
     } 

    } 

    public static void main(String[] args) { 
     // Test an integer array and pring all posible combinations 
     int N = 3; 
     ArrayPermutation a = new ArrayPermutation(N); 
     a.solver(N); 
    } 

    public void solver(int N) { 
     ArrayList<Integer> pArr = new ArrayList<>(); 
     ArrayList<Integer> preArr = new ArrayList<>(); 

     for (int i = 0; i < N; i++) { 
      pArr.add(i); 
     } 
     permute(preArr, pArr, N); 
    } 

    public void permute(ArrayList<Integer> preArr, ArrayList<Integer> pArr, int N) { 

     int n = pArr.size(); 
     ArrayList<Integer> helper = new ArrayList<>(); 

     if(n == 0){ 
      for (int i = 0; i < preArr.size(); i++) { 
       System.out.print(preArr.get(i) + " "); 
      } 
      System.out.println(""); 
     } else { 
      for (int i = 0; i < n; i++) { 
       for(int j = 0; j < n; j++){ 
        if(j == i) 
        { 
         preArr.add(pArr.get(j)); 
        } 
        else { 
         helper.add(pArr.get(j)); 
        } 

       } 
       permute(preArr, helper, N); 
       preArr.clear(); 
       helper.clear(); 
      } 

     } 

    } 

} 

Отсюда у меня есть следующее.

Expected Output 
0 1 2 
0 2 1 
1 0 2 
1 2 0 
2 0 1 
2 1 0 

Actual Output 
0 1 2 
2 1 
1 0 2 
2 0 
2 0 1 
1 0 

Так как вы можете видеть, у меня отсутствует первое целое из каждого второго списка. Я знаю, что я рядом, у меня просто возникают проблемы с выяснением этой конкретной проблемы. Я уже посмотрел на какую-то помощь, используя другие источники, но немного сложно понять мой конкретный пример. Я ценю любую помощь!

ответ

0

Вы очищаете preArr, прежде чем закончите с этим набором перестановок. Вероятно, вы захотите удалить последний элемент.

+0

Вау! Поэтому я заменил preArr.clear() на preArr.remove (preArr.size() - 1), и он сработал! Я чувствую себя немного глупее, но теперь чувствую облегчение, спасибо за то, что он указал, что это помогло мне, возможно, больше времени, чтобы разобраться в этом. –

Смежные вопросы