递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况
生活随笔
收集整理的這篇文章主要介紹了
递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
求一個集合S的m個元素組合的所有情況,并打印出來,非常適合采用遞歸的思路進行求解。因為集合的公式,本身就是遞歸推導的:
C(n,m) = C(n-1,m-1) + C(n-1,m)。
根據該公式,每次遞歸會分裂為兩次遞歸,直至m=1或m=n的情況,打印出當前組合情況。
本文實現了給定m的遞歸代碼,并且給出了求一個集合S所有可能的組合的情況,具體可參考下面代碼。
核心代碼為_fill 函數,往數組 cm 中填充,打印。
?
1 void combine<E>(Set<E> s, int m) { 2 if (m > 0 && m <= s.length) _fill(List<E>(m), s, 0, m); 3 } 4 5 void combineAll<E>(Set<E> s) { 6 for (var i = 1; i <= s.length; i++) combine(s, i); 7 } 8 9 void _fill<E>(List<E> cm, Set<E> a, int i, int m) { 10 if (m < a.length) { 11 cm[i] = a.first; 12 if (m > 1) { 13 _fill(cm, _rest(a, a.first), i + 1, m - 1); 14 } else { 15 print(cm); 16 } 17 _fill(cm, _rest(a, a.first), i, m); 18 } else { 19 for (var e in a) cm[i++] = e; 20 print(cm); 21 } 22 } 23 24 Set _rest<E>(Set<E> a, E e) { 25 var tmp = a.toSet(); 26 tmp.remove(e); 27 return tmp; 28 }?
轉載于:https://www.cnblogs.com/outerspace/p/10827029.html
總結
以上是生活随笔為你收集整理的递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP学习之PHP的语法糖
- 下一篇: 段空间