如何编写使用的setTimeout或setInterval的JavaScript中的阶乘函数
-
26-09-2019 - |
题
我问了一个问题,几个星期前,有关使用的setTimeout的阶乘的功能,但它与未注册账户是不幸的是,我从来没有得到一个完整的答案。
我的主要问题是,我想编写一个计算数的阶乘,但使用setTimeout或setInterval的命令的功能。这背后的推动力是重置IE使用,以避免长时间运行的脚本警告的计数器。目前,阶乘函数我是:
function factorial(n) {
return 0 === n || 1 === n ? 1 : n * factorial(n - 1)
}
在我的其他职务,jsumners还跟我提供的代码,试图利用的setTimeout定期计算阶乘时:
function factorial(x) {
executions++;
if (x > 1) {
if (executions % 20 === 0) {
return (function() {
var y = x;
setTimeout(function(y) { return y*factorial(y-1); }, 1);
});
} else {
return x*factorial(x-1);
}
} else {
executions = 0;
return 1;
}
}
在上面的代码,它理论上应该使用的setTimeout命令以执行下一个乘法时经过的执行次数是20(MOD 20)的一个因素。不幸的是,代码不工作,什么情况是,如果想计算数量更大的阶乘超过20,那么结果是NaN。如果数量小于20,则回答是正确的。
解决这个或另一种方式,通过使用的setTimeout或setInterval的命令来计算阶乘?的没有人知道
谢谢!
解决方案
这是因为你指定y
作为参数时执行,因为它不是在传递这是undefined
,你可以通过改变修复这样的:
setTimeout(function(y) { return y*factorial(y-1); }, 1);
要这样:
setTimeout(function() { return y*factorial(y-1); }, 1);
但是,它仍然会NaN
因为这里:
return (function() {
var y = x;
setTimeout(function() { return y*factorial(y-1); }, 1);
});
您还在返回的功能的,不是一个数字,可以成倍增加,所以你仍然不能使用这种方式的一个setTimeout()
。你可以通过一个回调执行时,一切都做了,但你不能把它重复并返回到这样的调用者。
其他提示
回调风格阶乘排定与每个的setTimeout反复步骤是:
// private helper function (recurrency with accumulation)
function _factorial(acc, n, callback){
if(n==0){
callback(acc);
}else{
var callback_wrapper = function(result){
callback(result);
};
setTimeout(function(){_factorial(acc * n, n-1, callback_wrapper)}, 10);
}
}
// public function
function factorial(n, callback){
_factorial(1, n, callback);
}
// usage example
factorial(10, function(result){console.log(result)});
- 干杯, Lambder
不隶属于 StackOverflow