Je veux écrire une fonction pour un moment factoriel
Mais le programme ci-dessous prend une grande période si un élément du tableau AR est grand. Quelqu'un peut-il m'aider à rendre le programme plus efficace? P> e (x_ {r}) = x! / (x - r)! code> p>
3 Réponses :
Essayez de multiplier des éléments en boucle au lieu de calculer math.Factorial: devrait être plus efficace pour les grands nombres.
for ix in ar:
if ix != 0:
a = 1
for el in range(order):
a = a * (ix - el)
sum += a
Vous pouvez également pré-calculer les factoriels au lieu de les calculer à chaque fois.
def fact_mom(ar, order):
factorial = [1] * MAX_VAL
for i in range(1, MAX_VAL):
factorial[i] = factorial[i - 1] * i
sum = 0.0
for ix in ar:
if ix != 0:
a = factorial[ix] / factorial[ix - order]
sum += a
return sum / len(tt)
Pas sur Python particulièrement mais vrai pour tout langage de programmation. Calcul de deux factoriels Tout d'abord, puis les diviser est beaucoup Overcalculé . De plus, cela peut facilement conduire à déborder dans le calcul même si le résultat lui-même n'est pas un débordement. Le débordement et le temps chargé de calculer les résultats intermédiaires entraînent une défaillance du calcul, mais parfois, il peut être évité. Faisons des mathématiques pure sur le fait de l'opération (a) / fait (A-X).
Les factoriels division des factoriels p> Le fait du facteur commun (A-x) annule
Donc, ce qui reste est p> en d'autres termes est aussi simple que celui-ci: p> essayez de calculer le fait (1000) / fait (1000-2) en utilisant des méthodes de calcul naïf et mathématiques. La méthode naïve dans la plupart des langues de programmation échouera loin avant de calculer le fait (50), mais vous devez calculer deux d'entre eux puis diviser. P> p>
Impossible de reproduire votre code.