대체 순열
Aug 24 2020
이 게시물은 내 이전 게시물의 확장입니다 : 작고 큰 요소의 순열
나는 순열을 번갈아 가며 작업하려고하는데 여기에 내 논리가 있습니다.
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 = 4에 대해 A [n + 1] = 5를 기대하고 있습니다. 그러나 나는 모두 0을 얻고 있습니다. 이 문제를 해결하는 방법.
답변
trincot Aug 24 2020 at 20:00
참조하는 André 의 공식 에서 합계 (∑)를 구현하지 않았습니다 .
또한 곧 부동 소수점 정밀도의 한계에 부딪 힐 것이기 때문에 계승 계산을 피할 것입니다. 대신 Pascal 삼각형을 사용할 수 있습니다 .
다음은 A 시퀀스의 무한 생성기 구현입니다. 데모는 A [0]의 값을 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;
}
이 시퀀스가 빠르게 증가함에 따라 곧 더 높은 정밀도가 필요합니다. 당신이 필요로하는 경우 를 [내가] 의 높은 값을 난 다음, 자바 스크립트의 사용 BigInt데이터 형식을.