Brandon Anzaldi - 1 year ago 61

Javascript Question

I'm working on implementing a subfactorial function in JavaScript to calculate the total number of derangements possible for

`n`

`function subfactorial (x) {`

x = parseInt(x);

var i;

var sub = 0;

var sum = 0;

sum += factorial(x);

for (i = 0; i < x; i++) {

sub += (Math.pow(-1, i)/factorial(i));

}

return sum * sub;

}

function factorial (y) {

var negative = y < 0;

y = parseInt(Math.abs(y)); // Ints only

var acc = 1;

for (y; y > 0; y--) {

acc *= y;

}

return negative ? -acc : acc;

}

function getSubfactorial () {

var val = document.getElementById('subfac').value;

document.getElementById('result').innerHTML = subfactorial(val);

}

`<label for="subfac">Subfactorial input:</label>`

<input type="number" id="subfac">

<button type="button" onClick="getSubfactorial()">Get Subfactorial</button>

<div id="result"></div>

For example,

`subfactorial(3)`

`subfactorial(4)`

`subfactorial(5)`

The formula I'm using comes out to be this:

`!x = x! \sum_{k=0}^{x}\frac {(-1)^k}{k!}`

Answer

You're going to laugh:

```
for (i = 0; i < x; i++) {
```

That not what the Sum symbol means. It should be

```
for (i = 0; i <= x; i++) {
```

Also, that is the most literal-minded way to implement subfactorial imaginable. The exponentiation is just a way to represent "oscillate between positive and negative one" -- but in Javascript, there are about 10 better ways to do that. And there is no reason to use (or worry about) floating-point. Instead of calculating 1/k! and then multiplying by x!, calculate x!/k!, which can be done as

```
var factDiv = function(x, k) {
return (k >= x) ? 1 : (x * factDiv(x-1,k));
}
```