2017-01-28 3 views
0

Мне любопытно, как я могу выполнить свой метод permuteAndPrintValuesThreeLists_Iterative рекурсивно ... Я знаю базовую рекурсию для сортировки массивов и выполнения двоичных поисков, но я не могу понять, как сделать ее методом рекурсивным.Рекурсивная перестановка с перечислениями Mutliple

Причина, по которой я хочу использовать рекурсию, заключается в том, что я хочу иметь возможность добавлять более 3 списков, не меняя свой метод, добавляя еще один цикл.

Вопрос: Как написать метод permuteAndPrintValuesThreeLists как метод recursive?

Мой вывод должен быть:

1 1 10 10 100 100 
1 1 10 10 200 200 
1 1 10 10 300 300 
1 1 20 20 100 100 
1 1 20 20 200 200 
1 1 20 20 300 300 
2 2 10 10 100 100 
2 2 10 10 200 200 
2 2 10 10 300 300 
2 2 20 20 100 100 
2 2 20 20 200 200 
2 2 20 20 300 300 

Но:

1 1 10 10 100 100 
200 200 
300 300 
400 400 
20 20 100 100 
200 200 
300 300 
400 400 
3 3 10 10 100 100 
200 200 
300 300 
400 400 
20 20 100 100 
200 200 
300 300 
400 400 

final class Problem { 

    public static void main(String[] args) { 
    Problem p = new Problem(); 
    p.permuteAndPrintValuesThreeLists_Iterative(); 
    } 

    private static List<int[]> l1; 
    private static List<int[]> l2; 
    private static List<int[]> l3; 

    private Problem() { 
    l1 = new ArrayList<>(); 
    l1.add(new int[] { 1, 1 }); 
    l1.add(new int[] { 2, 2 }); 

    l2 = new ArrayList<>(); 
    l2.add(new int[] { 10, 10 }); 
    l2.add(new int[] { 20, 20 }); 

    l3 = new ArrayList<>(); 
    l3.add(new int[] { 100, 100 }); 
    l3.add(new int[] { 200, 200 }); 
    l3.add(new int[] { 300, 300 }); 
    } 

    private static void permuteAndPrintValuesThreeLists_Iterative() { 
    for (int i = 0; i < l1.size(); i++) { 
     for (int j = 0; j < l2.size(); j++) { 
     for (int k = 0; k < l3.size(); k++) { 
      printArray(l1.get(i)); 
      printArray(l2.get(j)); 
      printArray(l3.get(k)); 
      System.out.println(); 
     } 
     } 
    } 
    } 

    private static void printArray(int[] a) { 
    for (int i : a) { 
     System.out.println(i + " "); 
    } 
    } 

} 

До сих пор я знал, что мне нужно иметь список, содержащий 3 списков (в в моем случае я добавил HashMap). У меня также есть этот метод решения, который частично решает проблему

private static Map<Integer, List<int[]>> allLists = new HashMap<>(); 
private static void permuteAndPrintValuesThreeLists_Recursion(List<int[]> resultList, int mapIndex) { 
    if (mapIndex == allLists.size()) { 
     // Debug code 
     for (int[] arr : resultList) 
      for (int i = 0; i < arr.length; i++) 
       System.out.println(arr[i] + " "); 
     resultList.clear(); 
     System.out.println(); 
     return; 
    } 
    for (int i = 0; i < allLists.get(mapIndex).size(); i++) { 
     int[] tmpArray = allLists.get(mapIndex).get(i); 
     resultList.add(tmpArray); 
     permuteAndPrintValuesThreeLists_Recursion(resultList, mapIndex + 1); 
    } 
} 
+3

Добро пожаловать в переполнение стека! Мы являемся сайтом «вопрос-ответ», а не услугой «Кодеры для найма». Пожалуйста, объясните, что вы пробовали до сих пор, и почему это не сработало. –

+0

Это может дать вам идею, хотя это и есть обобщенная задача нахождения всех перестановок строки «abc». Предположим, ваша функция называется 'perms', и она принимает строку в качестве входных данных и список строк в качестве вывода. Базовый регистр рекурсии - это когда длина строки составляет один символ. Просто верните единственный список, содержащий только один символ (продолжение ...) –

+0

Для рекурсивного случая заданные perms (строка с индексом 0..n-1) для каждой перестановки, возвращаемой perms (строка с индексом 1..n -1), вставьте строку [0] в перестановку с индексом 0, индексом 1, индексом 2 .. и в конце строки. Верните этот список строк, который будет 'n' factorial long. –

ответ

0

Добавляя попробовать поймать блок, я получил вывод, что я напечатал в моем вопросе. Я использую set, чтобы добавить новые значения для перестановки.

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

private static void solution_withRecursion(List<int[]> resultList, int mapIndex) { 
    if (mapIndex == allLists.size()) { 
     printListValues(resultList); 
     return; 
    } 
    for (int i = 0; i < allLists.get(mapIndex).size(); i++) { 
     int[] tmpArray = allLists.get(mapIndex).get(i); 
     try { 
      resultList.set(mapIndex, tmpArray); 
     } catch (IndexOutOfBoundsException e) { 
      resultList.add(tmpArray); 
     } 
     solution_withRecursion(resultList, mapIndex + 1); 
    } 
} 


private static void printListValues(List<int[]> list) { 
    for (int[] arr : list) { 
     for (int i : arr) { 
      System.out.print(i + " "); 
     } 
    } 
    System.out.println(); 
} 
Смежные вопросы