1public
static
class
iterator29
10private
static
void rotateright(ilistsequence, int
count)
1116
17private
static ienumerable> combinations(ilistsequence, int start, int count, int
choose)
1822
else
27rotateleft(sequence, start, count);28}
29}30}
3132
///33
///迭代從sequence中取出choose個元素的所有組合情況
34///
即c(n,m),n為sequence.count,m為choose
35///
36///
37///
38///
39///
注意返回的list的長度沒有縮短成choose,使用者可以只遍歷list的前choose個元素即可,或者呼叫take(choose)取出前choose個元素
40public
static ienumerable> combinations(this ilistsequence, int
choose)
4144
45private
static ienumerable> permutations(ilistsequence, int
count)
4650
else
55rotateright(sequence, count);56}
57}58}
5960
///61
///迭代sequence所有的排列情況
62///
63///
64///
65///
66public
static ienumerable> permutations(this ilistsequence)
6770
71///
72///
返回從字串s中取出count個字母的所有組合情況
73///
74///
75///
76///
77public
static ienumerable combinations(this
string s, int
count)
7882}83
84///
85///
返回字串s的所有排列情況
86///
87///
88///
89public
static ienumerable permutations(this
string
s)9094}
95 }
1foreach (var s in
"abcdef
".combinations(3
)) "
, s);3}
45 console.writeline("
---------------------");
67foreach (var s in
"abc
".permutations())
", s);
9 }
上面會輸出
abc abd abe abf acd ace acf ade adf aef bcd bce bcf bde bdf bef cde cdf cef def---------------------abc bac cab acb bca cba
這個演算法完全不需要分配額外空間,直接在原空間裡進行遍歷,所以對記憶體比較友好。但由於遍歷過程會直接修改原陣列,如果你不能接受這種情況,可以考慮在遍歷前拷貝乙份,對拷貝的那個陣列進行遍歷即可。
排列組合(包含所有組合可能和指定元素個數的組合)
當元素個數少時.元素組合方式 f 1 a a f 2 a,b b ba a f 3 a,b,c c cb cba ca b ba a f 4 a,b,c,d d dc dcb dcba dca db dba da c cb cba ca b ba a f n 由上表可以得出,n 個元素的所有組合方式...
遞迴用法 乙個排列組合的例子
abc的全排列 a開頭 abc acb b開頭 bca bac c開頭 cab cba 分析 遞迴過程 示例 includeusing namespace std int c1 0 統計遞迴次數 int c2 0 void show char p,int m void perm char a,con...
乙個排列組合演算法 裂變演算法
2009年1月15日 瀋陽 晴 為解決1月7日遇到的排列組合的難題,進行了以下題目的研究,並用c 實現了乙個非遞迴的演算法。有乙個list,list中存有n個物件,要求做出這n個物件所有無序組。數學公式 組合數 c n,1 c n,2 c n,n c 的演算法實現 一 組合生成器 二 測試程式 三 ...