遞迴實現 從n個數中選取m個數的所有組合

2021-07-10 00:22:58 字數 946 閱讀 9497

有n(

n>0)

個數,從中選取m(

n>

m>0)

個數,找出所有的組合情況(不分順序)。這樣的組合共有 cm

n=n×

(n−1

)×⋯×

(n−m

+1)m

! .

乙個陣列 data 有 n 個元素,從中選取 m 個數的組合 arr,使用遞迴演算法實現是這樣乙個過程:

1) 選擇 data的第1個元素為arr的第乙個元素,即:arr[0] = data[0];

2) 在data第乙個元素之後的其它元素中,選取其餘的 m - 1個數,這是乙個上述問題的子問題,遞迴即可。

3) 依次選擇 data的第 2 到 n - m + 1元素作為起始點,再執行1、2步驟。

4) 遞迴演算法過程中的 m = 0 時,輸出 arr 的所有元素。

c++ **如下:

template

void computeallchoices(std::vector

&data, int n, int outlen, int startindex, int m, int *arr, int arrindex)

std::cout

<< std::endl;

return;

}int endindex = n - m;

for(int i=startindex; i<=endindex; i++)

}

測試**如下:

int _tmain(int argc, _tchar* argv)

int arr[3];

computeallchoices(data, data.size(), 3, 0, 3, arr, 0);

return

0;}

參考:

從m個數中選擇n個數的實現

從m個數中選出n個數來 0 n m 要求n個數之間不能有重複,其和等於乙個定值k。求一段程式,羅列所有的可能。例如備選的數字是 11,18,12,1,2,20,8,10,7,6 和k等於 18 那麼組合的可能有 18 8,10 2,20 12,6 11,7 11,1,6 1,10,7 12,2,8 ...

等概率無重複的從n個數中選取m個數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!問題描述 程式的輸入包含兩個整數m和n,其中m學習過概率統計的同學應該都知道每乙個數字被抽取的概率都應該為m n.那麼我們怎麼構造出這樣的概率呢?在 程式設計珠璣 上面是這樣解析的 依次考慮整數0,1,2,n 1,並通過乙個適當的隨機測試對每個整數...

用遞迴實現從M個不同字元中選取N個字元的所有組合

以前做過類似字串的題目,當時覺得字串也能用遞迴來做非常神奇,後來思考了下,覺得只要抓住字串是由乙個個字元組成的,從第乙個字元到最後乙個字元每乙個都可以作為一次遞迴,把index作為引數傳進去就行,以這種思想為指導才把此題解了出來。對於每個字元只有兩種情況,設當前字串指標為x,目標字串指標為y get...