重复变异代码(组合学)?

时间:2010-03-02 19:30:26

标签: java algorithm recursion combinatorics

是否有人拥有用于生成所有VARIATIONS WITH REPETITION的Java代码?

有大量的排列和组合示例,变化必须是最简单的... 浪费时间重新发明轮子感觉很愚蠢(必须为此编写大量代码)。

VARIATIONS WITH REPETITION的一个例子可能是这样的:

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

谢谢!

4 个答案:

答案 0 :(得分:9)

这是按原样运作的,这对你来说是最容易学习的。

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);
            }
        }
    }
}

答案 1 :(得分: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 BBB

注意大型tupleSize的堆栈溢出。 递归算法(像这一个)通常比迭代版本慢,但它们对代码非常方便。

答案 2 :(得分:0)

How to write a brute-force password cracker

虽然这不是Java实现,但是进行排列的部分应该很容易在Java中移植。

我将它移植到C而不了解Python,它就像一个魅力。

答案 3 :(得分:0)