JavaScript實現元素全排列

2021-09-22 08:32:29 字數 2412 閱讀 7127

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 ...