I understand that because of JavaScript's single-threaded execution, long loops or recursive calls could make the browser unresponsive while they execute.
I thought about simulating recursion using setTimeout
with a delay of 0, so as to queue the next call to execute as soon as possible.
Here's an example comparing a standard recursive factorial function with an attempt to do the same thing but using setTimeout
:
function rFactorial(num)
{
if (num === 0) return 1;
else return num * rFactorial( num - 1 );
}
function tFactorial(num, callback, acc) {
acc = acc || 1;
if (num === 0) {
callback(acc);
}
else {
setTimeout(function() {
tFactorial(num-1, callback, acc*num);
}, 0);
}
}
I tested this using the following test:
for (var x = 1; x < 20; x += 1) {
tFactorial(x, (function(n) {
return function(result) {
console.log(rFactorial(n) === result)
};
})(x));
}
This worked for that range of numbers, although for higher numbers the two functions seem to give different results. for example, for 100, sFactorial
gives 9.332621544394418e+157
, while rFactorial
gives 9.33262154439441e+157
.
I have two questions:
- Is this a good approach? Can anyone suggest any improvements etc?
- Can anyone shed any light on why the two functions give the same results for lower numbers but different results for higher numbers?