我问了一个问题,几个星期前,有关使用的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

http://lambder.com/

http://vanadiumJS.com/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top