0

クリーンな再帰関数を使用して、と同じ結果を生成したい

static List<String> l, out;

l=new ArrayList<String>();
l.add("A");l.add("B");l.add("C");l.add("D");l.add("E");l.add("F");
for (int i = 0; i < l.size(); i++) {
    for (int j = i+1; j < l.size(); j++) {
        for (int k = j+1; k < l.size(); k++) {
            for (int t = k+1; t < l.size(); t++) {
                StringBuffer buffer = new StringBuffer(50);
                buffer.append(l.get(i));
                buffer.append(l.get(j));
                buffer.append(l.get(k));
                buffer.append(l.get(t));
                out.add(buffer.toString());
            }
        }
    }
}

ここには例えば4つのレベルがあります

私はそこで1回試してみましたhttp://pastebin.com/auSxQMHt

しかし、それは機能していません(出力を参照してください、私はそれほど多くの結果を取得していません)

どうも

4

1 に答える 1

0

これを試してみてください。インデックスが1つずれています。

private static final void loops(int i, StringBuffer buffer, int level, int k, int size) {
        if  (level>=k){
            out.add(buffer.toString());
        } else {
            for (int j = i; j < size; j++) {
                StringBuffer buf = new StringBuffer(buffer);
                buf.append(l.get(j));
                loops(j+1, buf, level+1, k, size);
            }
        }
}

... main() ...
    int size = l.size();
    loops(0, new StringBuffer(50), 0, 4, size);
... main() ...

結果は次のとおりです。

p1: 194580 duration:334 ms
p2: 194580 duration:370 ms

「intj= i + 1」を使用する代わりに、「int j = i 」を使用して、「loops(j + 1、buf、level + 1、k);」を渡します。

于 2012-05-31T21:04:58.397 に答える