Re: [問題] 數學的組合
看板Prob_Solve (計算數學 Problem Solving)作者yauhh (喲)時間12年前 (2012/02/29 11:24)推噓1(1推 0噓 0→)留言1則, 1人參與討論串2/2 (看更多)
※ 引述《chengchieh (cc)》之銘言:
: 其實只是要做C n 取 m 的功能
: 有一個array...長度為n
: 每次從中取出元素個數為m的array
: 預定的採用數值為C 13 取 5(標準的撲克牌手牌牌型查驗~)
: 目前瑣事有點多...腦袋不太靈光
: google的資料量太多...手邊排不出時間來整理
: 不知道有沒有人可以幫忙一下的...
: 感謝..
幫忙什麼事? 是幫忙告訴你怎麼做嗎?
如果問題定位為n取m的全部都要取出,基本型就是
boolean Comb(set, n, m, result) {
if (m == 0) return true; //結果在result中.
if (n < 0) return false;
boolean found;
Element a = set.firstElement;
Set set1 = set.removeFirst();
found = Comb(set1, n-1, m, result);
Set result1 = result.add(a);
found = found & Comb(set1, n-1, m-1, result1);
}
呼叫這個程序,是用 Comb(set, set.length(), m, {}).
另外 "非遞迴" 的組合求法,就是像在一根桿子上移動一些串珠那樣的求法.
先給一個陣列包含n個元素,元素內容是boolean,表示選取或不選取的狀態.
一開始陣列左端m個元素設定為true.
為了方便說明,我們把false的元素說成是一個空的格子.
1. 將最右端連續空的格子消除: 也就是將最右邊的連續空格子之右邊的元素向左推,
結果是使最右邊的連續false的右邊找不到任何true.
2. 將最右邊一個可以右移的格子向右移: 所謂可以右移,就是格子本身為true,並且
右邊一格為false.
3. 記錄目前true元素的狀態: 此時標記為true的m個元素,是n取m的一種情況.
4. 如果不是最右邊m個元素標記為true,則從第1步重新執行.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.66.119
推
02/29 14:25, , 1F
02/29 14:25, 1F
討論串 (同標題文章)
Prob_Solve 近期熱門文章
PTT數位生活區 即時熱門文章