日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归算法之排列组合-求一个集合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个元素的组合和所有可能的组合情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。