Question

J'ai posé une question il y a quelques semaines sur l'utilisation de setTimeout pour une fonction factoriel, mais il était malheureusement avec un compte non enregistré et je n'a jamais eu une réponse complète.

Mon principal problème est que je voudrais écrire une fonction qui calcule le factoriel d'un nombre, mais utilise le setTimeout ou setInterval commandes. L'élan derrière cela est de réinitialiser un compteur IE utilise de manière à éviter un avertissement de script de longue durée. À l'heure actuelle, la fonction factoriel j'est:

function factorial(n) {
  return 0 === n || 1 === n ? 1 : n * factorial(n - 1)
}

Dans mon autre post, jsumners a eu la gentillesse de me fournir le code qui a essayé d'utiliser setTimeout périodiquement lors du calcul factoriel:

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;
   }
}

Dans le code ci-dessus, il devrait théoriquement utiliser la commande setTimeout pour effectuer la multiplication suivante lorsque le nombre d'exécutions écoulées est un facteur de 20 (mod 20). Malheureusement, le code ne fonctionne pas, et ce qui se passe est que si vous essayez de calculer le factoriel d'un nombre supérieur à 20, alors le résultat est NaN. Si le nombre est inférieur à 20, alors la réponse est correcte.

Quelqu'un sait-il d'une solution à ce ou d'une autre façon de calculer une factoriel en utilisant les commandes de SetTimeOut ou setInterval?

Merci!

Était-ce utile?

La solution

Il est parce que vous spécifiez y comme paramètre qui est undefined lorsqu'il est exécuté parce qu'il est pas passé, vous pouvez le corriger par le changement ceci:

setTimeout(function(y) { return y*factorial(y-1); }, 1);

Pour cela:

setTimeout(function() { return y*factorial(y-1); }, 1);

Cependant, il sera toujours NaN car ici:

      return (function() {
          var y = x;
          setTimeout(function() { return y*factorial(y-1); }, 1);
       });

Vous êtes toujours un retour fonction , un nombre qui peut être multiplié, de sorte que vous ne pouvez toujours pas utiliser un setTimeout() de cette manière. Vous pouvez passer un rappel qui exécute quand tout est fait, mais vous ne pouvez pas avoir récursion et le retour à un appelant comme celui-ci.

Autres conseils

Le factoriel style de rappel à chaque étape récurrente prévue avec setTimeout est:

// 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)});

- À votre santé, Lambder

http://lambder.com/

http://vanadiumJS.com/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top