0
votes

moment factoriel et en chute factorielle

Je veux écrire une fonction pour un moment factoriel

e (x_ {r}) = x! / (x - r)!

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? xxx


1 commentaires

Impossible de reproduire votre code.


3 Réponses :


0
votes

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


0 commentaires

0
votes

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)


0 commentaires

0
votes

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 xxx

division des factoriels xxx

Le fait du facteur commun (A-x) annule Donc, ce qui reste est xxx

en d'autres termes est aussi simple que celui-ci: xxx

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.


0 commentaires