2010-03-02 2 views
2

Есть ли у кого-нибудь код Java для генерации всех ИЗМЕНЕНИЙ С ПОВТОРЯЕМ?Код для вариаций с повторением (комбинаторика)?

Существует множество примеров перестановок и сочетаний, а варианты должны быть самыми легкими ... Глубоко тратить время, чтобы изобретать велосипед (для этого нужно написать много кода).

Пример ВАРИАЦИЙ с повтором может быть такой:

(tupletSize=3, input= A, B) 
AAA, AAB, ABA, BAA, ABB, BAB, BBA, BBB 

Спасибо!

ответ

4
public class Main { 

    public static void main(String[] args) throws IOException { 
     LinkedList<char[]> items = new LinkedList<char[]>(); 
     char[] item = new char[3]; 
     char[] input = {'A', 'B'}; 
     rep(items, input, item, 0); 


     for (char[] rep : items) { 
      System.out.println(rep); 
     } 
    } 

    private static void rep(LinkedList<char[]> reps, char[] input, char[] item, int count){ 
     if (count < item.length){ 
      for (int i = 0; i < input.length; i++) { 
       item[count] = input[i]; 
       rep(reps, input, item, count+1); 
      } 
     }else{ 
      reps.add(item.clone()); 
     } 
    } 

} 

производит следующий вывод: AAA AAB ABA ABB BAA BAB BBA ВВВ

следить за переполнения стека с большим tupleSize. Рекурсивные алгоритмы (как этот) обычно медленнее, чем итеративные версии, но они очень удобны для кодирования.

+0

Спасибо большое! У меня возникли некоторые ошибки при компиляции, но код обязательно поможет! – EvoMangan

+0

Вы собираетесь исчерпать память задолго до того, как стек переполнится, если вход имеет два или более элементов. –

+0

yap, вы правы - я думаю, что «о бог - следите за рекурсией» был быстрее, чем мышление ;-). поэтому в коде кода, я думаю, мы не будем класть char [] s :-) – Mathias

0

How to write a brute-force password cracker

Хотя это не реализация Java, часть делает перестановки должны быть довольно легко портировать на Java.

Я портировал его на C без знания Python, и он работал как шарм.

+0

Он работал как шарм? У вас действительно были взломаны пароли? ;) – pmr

+0

Да, но только те, которые были указаны для задания на домашнее задание (длиной 3-4 символа) :-) – helpermethod

8

Это работает так, как есть, и это самое легкое для вас изучение.

public class Main { 
    public static void main(String args[]) { 
     brute("AB", 3, new StringBuffer()); 
    } 
    static void brute(String input, int depth, StringBuffer output) { 
     if (depth == 0) { 
      System.out.println(output); 
     } else { 
      for (int i = 0; i < input.length(); i++) { 
       output.append(input.charAt(i)); 
       brute(input, depth - 1, output); 
       output.deleteCharAt(output.length() - 1); 
      } 
     } 
    } 
} 
+0

Красиво! Спасибо !!! – EvoMangan

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