Как написать факториальную функцию в JavaScript с помощью Settimeout или Setinterval

StackOverflow https://stackoverflow.com/questions/4019808

Вопрос

Я задал вопрос пару недель назад о использовании SettimeOut для факториальной функции, но это было к сожалению, с незарегистрированным счетом, и я никогда не получил полный ответ.

Моя главная проблема заключается в том, что я хотел бы написать функцию, которая рассчитывает факториал числа, но использует команды Settimeout или Setinterval. Импульс за этим состоит в том, чтобы сбросить счетчик The 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;
   }
}

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

- ура, лямбр

http://lambder.com/

http://vanadiumjs.com/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top