簡體   English   中英

小元素和大元素的排列

[英]Permutations of small and large elements

如果數組是: 2,3,7,9 ; 那么我們可以進行排列的方式是:

2 7 3 9
2 9 3 7
3 7 2 9
3 9 2 7
7 9 2 3

so total ways are 5.

這里的限制是:

  1. 一旦選擇了一個元素,下一個元素必須比它大。
  2. 此后的下一個元素必須小於前一個元素,依此類推,直到最后一個元素。

我有以下代碼,但我無法獲得排列的邏輯:

 let array = [2, 3, 7, 9]; array.sort((a, b) => a - b); let res = []; let n = array.length; let i = 0; let j = n - 1; let k = 0; while (i < j) { res[k++] = array[i++]; res[k++] = array[j--]; } if (n % 2 != 0) { res[k++] = arr[i]; } console.log(res);

基於評論:

function Factorial(n) { 

    var res=1; 
      
    for (var i = 2; i <= n; i++) 
        res = res * i; 
    return res; 
} 


let n = 4;
let A = [];
let C = [];
let a = Factorial(n);
for(let i=0; i<=n;i++) {
    A[i] = 0;
}
A[1] = 1;
for(let k=0; k<n; k++) {
    let b = Factorial(k)*Factorial(n-k);
    
    A[k] = a/b * A[k]*A[n-k]/2;
}
console.log(A);



prints [0, 0, 0, 0]

這種排列稱為鋸齒形或交替排列

眾所周知, n元素的這種排列的數量可以用循環公式來描述:

A(n+1) = Sum(k=0..n){C(n,k)*A(k)*A(n-k)} / 2

其中A(n)n項的排列數, initial A[] = 1C(n,k)二項式系數

所以我們可以逐步用計算出的條目填充數組

 function cnk(n, k) { let res = 1; for (let i = 0; i < k; i++) res = res * (n - i) / (i + 1); return res; } let m = 15; let A = [1,1]; for (let i = 0; i < m-1; i++) { A.push(0); } for (let n = 2; n < m; n++) for (let k = 0; k <= n; k++) A[n + 1] += A[k] * A[n - k] * cnk(n, k) / 2; console.log(A);

[1, 1, 1, 2, 5, 16, 61, 272, 1385, 7936, 50521, 353792, 2702765,
 22368256, 199360981, 1903757312]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM