Как написать функцию факториала в Javascript, используя setTimeout или setInterval - PullRequest
2 голосов
/ 26 октября 2010

Я задал вопрос пару недель назад об использовании 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 (мод 20). К сожалению, код не работает, и что происходит, если попытаться вычислить факториал числа больше 20, то результатом будет NaN. Если число меньше 20, тогда ответ правильный.

Кто-нибудь знает решение того или иного способа вычисления факториала с помощью команд setTimeout или setInterval?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 26 октября 2010

Это потому, что вы указываете 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() таким образом.Вы можете передать обратный вызов, который будет выполнен, когда все будет сделано, но вы не можете сделать так, чтобы он возвращался и возвращался вызывающему абоненту, как этот.

0 голосов
/ 11 января 2011

Факториал стиля обратного вызова с каждым повторяющимся шагом, запланированным с помощью 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/

...