2015-04-13 4 views
0

я найти код, но я не понимаю, рекурсии ЧастьВсе перестановки слов в строке Java

public static void main (String args[]) { 
     System.out.println("Please enter the string whose permutations we need to show "); 
     Scanner in = new Scanner(System.in); 
     String original=in.nextLine(); 
     System.out.println("Results are :"); 
     permute(original); 
    } 

    public static void permute(String input) { 
     int inputLength = input.length(); 
     boolean[ ] used = new boolean[ inputLength ]; 
     StringBuffer outputString = new StringBuffer(); 
     char[ ] in = input.toCharArray(); 
     doPermute (in, outputString, used, inputLength, 0); 
    } 

    public static void doPermute (char[ ] in, StringBuffer outputString, 
    boolean[ ] used, int inputLength, int level) { 
     if(level == inputLength) { 
      System.out.println (outputString.toString()); 
      return; 
     } 
     for(int i = 0; i < inputLength; i++) { 
      if(used[i]) continue; 
      outputString.append(in[i]); 
      used[i] = true; 
      doPermute(in, outputString, used, inputLength, level + 1); 
      used[i] = false; 
      outputString.setLength( outputString.length() - 1); 
     } 
    } 
} 

вход:

ABC 

ВЫВОД:

ABC ACB BAC BCA CAB CBA 
+9

так, в чем ваш вопрос? – Mysterion

+0

'doPermute' является рекурсивной функцией. –

+0

Я не понимаю, как doPermute() работает после печати ABC и используется [2] = false, i = 2, ouputtstring = "AB" с приращением цикла, он должен выйти из цикла как i = 3. –

ответ

0
public static void doPermute(char[] in, StringBuffer outputString, 
     boolean[] used, int inputLength, int level) { 
    if (level == inputLength) { 
     System.out.println(outputString.toString()); 
     return; 
    } 
    for (int i = 0; i < inputLength; i++) { 
     if (used[i]) 
      continue; 
     outputString.append(in[i]); 
     used[i] = true; 
     doPermute(in, outputString, used, inputLength, level + 1); 
     used[i] = false; 
     outputString.setLength(outputString.length() - 1); 
    } 
} 

Он принимает следующие входы:

в: массив символов на входе при условии

outputString: Сформирован Строка каждой комбинации

используется: Имеет информацию о характере используется или нет в этой комбинации

inputLength: длина символа для указания длины, необходимой для каждой комбинации

уровень: Он указывает размер выполняемой комбинации.

например.

если вы даете входные данные как «ABC»

вызов к doPermute будет как

({A,B,C}, "", {false,false,false}, 3, 0) 

используется логический массив хранится в соответствии с в массиве т.е. в [0] = A используется [0] = ложь, что означает, что «A» не используется

теперь он не пойдет в if (level == inputLength) а уровень 0 и InputLength является 3

в for loopoutpuString добавляется "А" и поставить используется [0], как истинный

это назвать doPermute ({A,B,C},"A",{true,false,false},3,1)

теперь будет пропустить if, как длина еще 1

входит в for loop

пропускает «А» как used[0] является true в следующем добавить «B» устанавливает used[1] как true и вызывает функцию, которая будет добавлять «C» и останавливается.

+1

Хорошо, вы объяснили параметры. Не могли бы вы также объяснить сам алгоритм? – hexafraction

+0

Я изменил ответ. надеюсь, что это решит проблему –

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