Wechselnde Permutationen

Aug 24 2020

Dieser Beitrag ist eine Erweiterung meines vorherigen Beitrags: Permutationen kleiner und großer Elemente

Ich versuche an abwechselnden Permutationen zu arbeiten und hier ist meine Logik:

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]

Ich erwarte A [n + 1] = 5 für die Eingabe n = 4 gemäß meinem vorherigen Beitrag. Aber ich bekomme alle Nullen. So beheben Sie dieses Problem.

Antworten

trincot Aug 24 2020 at 20:00

Sie haben die Summe (∑) nicht in die Formel von André implementiert, auf die Sie sich beziehen.

Ich würde auch die Berechnung von Fakultäten vermeiden, da Sie bald auf eine Einschränkung der Gleitkommapräzision stoßen werden. Sie können stattdessen das Dreieck von Pascal verwenden .

Hier ist eine Implementierung eines unendlichen Generators der A-Sequenz. Die Demo druckt die Werte von A [0] bis A [20]:

function * andre() { // generator
    let pascal = [1];
    let a = [1, 1];
    yield a[0];
    
    let n = 1;
    while (true) {
        yield a[n];
        // Build the next row in Pascal's Triangle
        pascal[n] = 1;
        for (let i = n - 1; i > 0; i--) {
            pascal[i] += pascal[i-1];
        }
        // Apply André's formula
        let sum = 0;
        for (let k = 0; k <= n; k++) {
            sum += pascal[k] * a[k] * a[n-k]
        }
        a[++n] = sum / 2;
    }
}

// demo: display A[0] up to A[20]
let i = 0;
for (let a of andre()) {
    console.log(`A[${i++}] = ${a}`);
    if (i > 20) break;
}

Da diese Sequenz schnell zunimmt, benötigen Sie bald eine höhere Präzision. Wenn Sie A [i] für höhere Werte von i benötigen , verwenden Sie den BigIntDatentyp von JavaScript .