n 個不同元素中任意選取 m (m <= n) 個元素進行排列,所有排列情況的個數叫做排列數,其值等於:
a = n! / (n - m)!
!
表示數學中的階乘運算子,可以通過以下函式實現:
function
factorial
(n)else
if(n <0)
else
}console.
log(
factorial(4
));// 24
當 n = m 時,稱為全排列,其值等於:
a = n!
全排列相當於將所有元素進行排序,得到所有不同順序情況的個數;
利用階乘函式,通過上述數學公式只能得到所有情況的個數值,不容易得到具體的每種情況,要獲取每種情況的輸出值的話需要另尋他法;
用陣列舉例分析:
全排列:
[1, 2, 3] => [
[1, 2, 3],
[1, 3, 2],
[2, 1, 3],
[2, 3, 1],
[3, 1, 2],
[3, 2, 1]
]共 6 種情況
樹狀圖表示:
1 2 3
/ \ / \ / \
2 3 1 3 1 2
| | | | | |
3 2 3 1 2 1 => 6
3 個元素中選取 2 個時:(n = 3, m = 2)
[1, 2, 3] => [
[1, 2],
[1, 3],
[2, 1],
[2, 3],
[3, 1],
[3, 2]
]共 6 種情況
樹狀圖表示:
1 2 3
/ \ / \ / \
2 3 1 3 1 2 => 6
let arr =[1
,2,3
];/*引數 a 為輸入陣列,
元素個數 n 為 a 的長度,
選取個數為 m;
*/function
permutation
(a, m)
else}}
// 開始執行遞迴,然後返回最後結果
recur
(a);
return result;
}console.
log(
permutation
(arr));
// 3 個數全排列:
/*[
[1, 2, 3],
[1, 3, 2],
[2, 1, 3],
[2, 3, 1],
[3, 1, 2],
[3, 2, 1]]*/
console.
log(
permutation
(arr,2)
);// 3 個數中選取 2 個數排列:
/*[
[1, 2],
[1, 3],
[2, 1],
[2, 3],
[3, 1],
[3, 2]
]*/
最終實現函式就是permutation(a, m)
,其中引數a
為輸入陣列,包含需要排列的所有元素,引數m
為選取需要排列的個數,預設等於輸入陣列的長度,即預設全排列,注意m
不能大於元素個數;
以上函式輸出值為乙個二維陣列,如果需要便於觀察,輸出乙個一維陣列,可以定義乙個合併函式:
function
merge
(arr)
let result =
merge
(permutation([
1,2,
3]))
;console.
log(result)
;// [123, 132, 213, 231, 312, 321]
技術文章推送
手機、電腦實用軟體分享
實現元素的全排列
想到 前幾天的乙個問題,如何實現元素的全排列 並且按照公升序輸出。可以有兩種方法 遞迴和非遞迴 首先介紹非遞迴的方法 思路 以三個數字為例1,2,3公升序的全排列為 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 顯然每個組合 都有乙個直接後繼,找到乙個數沒有後繼如 3 2 ...
陣列元素全排列(c c 實現)
其實全排列的說白了就是,元素之間兩兩交換,交換後對其他元素進行全排,全排完其他元素,再把原先交換的那兩個元素交換回來。不過這個過程要靠遞迴實現,需要對遞迴的知識有一定的把握。下面附上 本人菜雞,初入部落格,大神多多指教。include bits stdc h using namespace std ...
JavaScript查詢元素
w3c為我們提供了比較方便的定位節點的方法和屬性,以便我們快速的對節點進行操作。分別為 方法說明 getelementbyid 獲取去特定id元素的節點 getelementbytagname 獲取相同元素的節點列表 getelementbyname 獲取相同名稱的節點列表 geattribute ...