1. 程式人生 > >排列組合_組合_程式實現

排列組合_組合_程式實現

/* * 組合即沒有順序,以 A B C中取出任意兩個為例 * 結果為 AB AC BC 三種情況 * 實現:在有序排列的基礎上排序去重 * 有序排列的時候為: * AB AC BA BC CA CB * 先對每個進行排序: * AB AC AB BC CA BC * 在進行去重: * AB AC BC * * * * */ var arr = ['A', 'B', 'C']; // 所以情況的陣列 var resultAll = []; /* * 從arr中選擇num個,當然 num >= 1 && num <= arr.length * * * */
function show(arr, num){ // 如果只選一個,那就是arr的個數了 if(num === 1){ arr.push(arr.length); return arr; } if(num > arr.length || num <= 0){ alert(arr + '中只能取出1~' + arr.length + '個,而你想取出' + num + '個'); return; } // 遞迴的第幾層,也是選擇的第幾個數
let iNow = 1; /* * 遍歷+遞迴 * * */ function change(arr, iNow, str){ // 第一層有3個 ==> A B C for ( let i = 0; i < arr.length; i++ ){ // 複製,防止引用 let result = arr.concat(); // 複用字串,拼接,也放在出錯 let
strClone = str; // 剔除當前值,還剩result.length - 1個 strClone += result.splice(i, 1); // A // 是否停止遞迴,這裡以兩層為例 if(iNow === num){ // 停止 // 這時候result中有 B/C for ( let j = 0; j < result.length; j++ ){ // 依次拼接 AB AC resultAll.push( strClone + result[j] ); } } else { // 注意這裡的result傳入之後,下次遞迴中的arr就變成result了 change(result, iNow + 1, strClone); } } } change(arr, iNow + 1, ''); // 把個數新增到結果末尾 //console.log(resultAll); // 排序去重--將有序排列的給傳遞進去 function unique(arr){ let result = []; for ( let i = 0; i < arr.length; i++ ) { result.push(arr[i].split('').sort().join('')); } // 得到排序結果 //console.log(result) // 開始去重 var obj = {}; for ( let i = 0; i < result.length; i++ ) { if(!obj[result[i]]){ obj[result[i]] = 1; } } // 得到去重後的物件 // console.log(obj); // 將物件中的值依次賦給新陣列 let newArr = []; for ( let attr in obj ) { newArr.push(attr); } // 得到不重複的陣列 //console.log(newArr); return newArr; } resultAll = unique(resultAll); // 再把個數新增進去 resultAll.push(resultAll.length); return resultAll; } console.log(show(arr, 3)); // 3中2