2017-05-21 6 views
0

Même si j'apprends JavaScript, j'ai trouvé cette solution pour Factoriels et j'aimerais obtenir des commentaires. Serait-ce efficace? Factoriels avec JavaScript

function factorialize(num) { 
var total= []; 
    if(num!==0){ 
    for(var i=1; i<=num; i++){ 
     total.push(i); 
    } 
    var newTotal = total.reduce(function(a,b){ 
     return a*b; 
    }); 
    return newTotal; 
    }else { 
    return 1; 
    } 
} 
console.log(factorialize(6)); 

Cette autre manière que je trouvais en ligne facile à lire et à comprendre, je pense tout simplement ne peux pas de cette façon.

non récursive

var factorial = function(n) { 
if(n == 0) { 
    return 1 
} else { 
    product = 1; 
    for(i = 1; i <= n; i++) { 
     product *= i; 
    } 
    return product; 
    } 
} 
console.log(factorial(num)); 

récursive:

var factorial = function(n) { 
if(n == 0) { 
    return 1 
} else { 
    return n * factorial(n - 1); 
} 
} 
console.log(factorial(num)); 
+0

"J'aimerais avoir des commentaires" est trop vague pour ce site. Si vous avez une préoccupation particulière, dites-nous. Si ce n'est pas le cas, vous pouvez poser cette question sur le [Code Review site] (https://codereview.stackexchange.com/). –

+0

La première méthode est intéressante; placez les nombres dans un tableau, puis utilisez la méthode array.reduce. Ça va être moins efficace que de simplement multiplier au fur et à mesure. Principalement à cause de tout l'accès au tableau que vous devez faire. La méthode récursive nécessite beaucoup d'appels de fonctions donc elle est moins efficace que la simple boucle. Toutes les méthodes sont utiles pour introduire des concepts de programmation, mais pas toujours les plus pratiques. –

+0

Je pense aussi que je gaspille des ressources en utilisant un tableau au début. Je ne semble pas avoir une approche simple comme les solutions récursives ou non récursives. Bummer! – crg821

Répondre

1

Votre solution est raisonnable, bien que ce qui pourrait être critiqué à ce sujet, est qu'il est un peu inutile avec la mémoire. Les autres versions n'ont besoin de conserver qu'une seule valeur intermédiaire en tant qu'état (en supposant une optimisation de la fin de l'appel pour la version récursive), alors que votre algorithme repose sur un tableau de longueur n. Vous pouvez utiliser un générateur au lieu d'une liste pour éviter cela.

+0

Appel de départ? - Parlez-vous de factoriel (n - 1)? Quand est-ce appelé dans la fonction? Je ne comprends pas ça. J'ai essayé d'apprendre JS et ne peux toujours pas aborder des problèmes comme ceux-ci de la manière du programmeur. – crg821

+0

Cela ne s'applique pas uniquement au javascript. L'implémentation de la récursivité naïve impose un coût mémoire par appel, ce qui peut être évité par une optimisation appelée tail-recursion. Cela nécessite que l'appel récursif soit la dernière instruction de la fonction, ce qui est le cas pour la définition récursive ci-dessus. – nucleon