排列組合_排列_程式實現
阿新 • • 發佈:2018-12-26
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
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;
}
let resultNum = 0;
// 遞迴的第幾層,也是選擇的第幾個數
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){
// 停止
resultNum += result.length;
// 這時候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, '');
// 把個數新增到結果末尾
resultAll.push(resultNum);
return resultAll;
}
console.log(show(arr, 2)); // 3中2
</script>
</body>
</html>