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