• 2

求解 排列組合 程式

如果只是要列出來,用遞迴應該蠻直覺的。
要解 n 的組合
取 1,遞迴解 n-1
取 2,遞迴解 n-2
............
取 n,遞迴解 0

基本架構大概像這樣
Solve ( n ) {
 for ( i = 1; i <=n; i++ ) {
  save i to answer list ;
  Solve ( n - i );
 }
}

接下來就是看你要用什麼方式 / 資料結構去處理答案的部分
一個比較簡單的方法就是把已經取的數字存在陣列,然後當成參數一起遞迴
最後達到終止條件時,陣列裡存的就是一個解
謝謝大家的熱心幫忙,最後我是把它分成兩部份來做

1 ,先將前面較小後面較大或等於的數字列出來,不排列
例如只抓13 不考慮31

2 , 接下來用c++既有的function next_permutation() 去整理排列就可將31 也印出來,這個函式還能順便去掉重覆的,讚

(Google了三天才看到 這個寶)
提供遞迴寫法參考
#include <iostream>

/**
* [參數說明]
* n 剩下幾個數可用
* record 紀錄先前的資料
* len record 已存的資料長度
*/
void printAllCombine(int n, int* record, int len)
{
int i, j;
for (i = 1; i <= n; ++i) {
record[len++] = i;
if (n - i == 0) {
for (j = 0; j < len; ++j) {
std::cout << record[j] << ' ';
}
std::cout << std::endl;
} else {
printAllCombine(n - i, record, len);
}
--len;
}
}

int main()
{
int record[5];
printAllCombine(5, record, 0);
return 0;
}
ren1244 wrote:
提供遞迴寫法參考#include...(恕刪)


謝謝您,和我寫的很像

此外,下班前又發現,c++裡有一個函式庫vector,裡面有push_back和pop_back這兩支既有的函式,不用遞迴,coding雖少,跑起來performance更好,

今天看到leetcode裡有很多人提到的一題,數入兩數字,不用加減法,求和,出題者也太天才了
tend.tw

也看到一題,不用除法算兩個整數相除。https://et0526.blogspot.com/2025/05/etleetcode-29-divide-two-integers.html

2025-06-08 13:02
簡單的想法:

想象這有五個數字1
1␣1␣1␣1␣1

這5個1字之間共有4個空間,你要在其中0-4個空間加入分隔符,將這五個1字分為1-5組,例如
1 1 1 1 1
1 1 1 1|1
1 1 1|1 1
1 1 1|1|1
1 1|1 1 1
...

如此類推,窮舉所有組合

(JavaScript)
for(var i=0;i<16;i++){
var s="";
var t=1;
for(var j=0;j<4;j++){
if(((i>>j)&1)==1){
s+=" "+t;
t=1;
}else{
t++;
}
}
s+=" "+t;
console.log(s);
}



(C++)
https://onlinegdb.com/OJpFSKZrz
以你的需求,其實就是一個簡單的遞迴函數即可完成。
你已經知道怎麼把所有排列找出來,只是不知道如何用程式語言描述你的方法,
這邊我給你一種寫法,看看程式運作邏輯是否與你找排列的方法相同。





線上編譯器連結: https://onlinegdb.com/2vauVc9Pk

簡單的事情用簡單的方法做最好,這邊用二元樹感覺有點殺雞用牛刀!
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?