Permutazioni alternate
Questo post è un'estensione del mio post precedente: Permutazioni di elementi piccoli e grandi
Sto cercando di lavorare su permutazioni alternate ed ecco la mia logica:
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]
Mi aspetto A [n + 1] = 5 per l'input n = 4 come da post precedente. Ma ottengo tutti zeri. Come risolvere questo problema.
Risposte
Non hai implementato la somma (∑) nella formula di André a cui ti riferisci.
Eviterei anche di calcolare i fattoriali poiché presto ti imbatterai in una limitazione della precisione in virgola mobile. Puoi invece usare il triangolo di Pascal .
Ecco un'implementazione di un generatore infinito della sequenza A. La demo stampa i valori da A [0] fino a 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;
}
Poiché questa sequenza aumenta rapidamente, presto avrai bisogno di una maggiore precisione. Se hai bisogno di A [i] per valori più alti di i , usa il BigInt
tipo di dati di JavaScript .