排列組合_組合_程式實現
阿新 • • 發佈:2018-12-26
/*
* 組合即沒有順序,以 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