Jak mam obliczyć silnię liczby całkowitej w Pythonie?
135
Najłatwiejszym sposobem jest użycie math.factorial
(dostępne w Pythonie 2.6 i nowszych):
import math
math.factorial(1000)
Jeśli chcesz / musisz napisać to sam, możesz zastosować podejście iteracyjne:
def factorial(n):
fact = 1
for num in range(2, n + 1):
fact *= num
return fact
lub podejście rekurencyjne :
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
Zwróć uwagę, że funkcja silnia jest zdefiniowana tylko dla dodatnich liczb całkowitych, więc powinieneś również sprawdzić to n >= 0
i to isinstance(n, int)
. Jeśli tak nie jest, podbij odpowiednio a ValueError
lub a TypeError
. math.factorial
zajmie się tym za Ciebie.
factorial
tejfactorial
funkcji. Jak możesz użyć tej samej funkcji w ramach funkcji, którą obecnie definiujesz? Jestem nowy w Pythonie, więc po prostu próbuję zrozumieć.RecursionError
dla dowolnej liczby większej niż 998 (spróbujfactorial(999)
), chyba że zwiększysz limit rekursji w PythonieW Pythonie 2.6 i nowszych wypróbuj:
źródło
float
do tej funkcji spowoduje podniesienieDeprecationWarning
. Jeśli chcesz to zrobić, musisz przekonwertowaćn
naint
jawnie:,math.factorial(int(n))
co spowoduje odrzucenie wszystkiego po przecinku, więc możesz to sprawdzićn.is_integer()
Nie jest to konieczne, ponieważ jest to taki stary wątek. Ale zrobiłem tutaj, to inny sposób obliczenia silni liczby całkowitej za pomocą pętli while.
źródło
num = num * n
pozycję wiersza zn = n - 1
i uruchamiam tofor i in range(1, 5): print('Factorial of', i, 'is', factorial(i))
Dla każdego silniowego, wynik wynosi 0. Chciałbym poznać uzasadnienie, dlaczegonum = num * n
musi być pierwsze. Dzięki!!Istniejące rozwiązanie
Najkrótszym i prawdopodobnie najszybszym rozwiązaniem jest:
Budowanie własnego
Możesz także zbudować własne rozwiązanie. Ogólnie masz dwa podejścia. Najbardziej mi odpowiada:
(działa również dla większych liczb, gdy wynik stanie się
long
)Drugim sposobem osiągnięcia tego samego jest:
źródło
źródło
factorial(999)
(i powyżej) podniesie a,RuntimeError
chyba że zwiększysz limit rekursji w PythonieJeśli używasz Python2.5 lub starszego, spróbuj
w przypadku nowszego Pythona w module matematycznym występuje silnia, jak podano w innych odpowiedziach tutaj
źródło
reduce
została usunięta z Pythona 3.from functools import reduce
źródło
Używając
for
-loop, licząc wstecz odn
:źródło
Ze względu na wydajność nie używaj rekursji. To byłoby katastrofalne.
Sprawdź wyniki pracy
Korzystanie ze stosu jest wygodne (podobnie jak wywołanie rekurencyjne), ale ma swoją cenę: przechowywanie szczegółowych informacji może zająć dużo pamięci.
Jeśli stos jest wysoki, oznacza to, że komputer przechowuje wiele informacji o wywołaniach funkcji.
Metoda zajmuje tylko stałą pamięć (podobnie jak iteracja).
Lub używając pętli for
Sprawdź wyniki pracy
Lub używając matematyki wbudowanej
Sprawdź wyniki pracy
źródło
źródło
Oto moja próba
źródło
Działa również jedna linia, szybkie i duże liczby:
źródło
Wiem, że na to odpowiedziano, ale oto inna metoda ze zrozumieniem listy z odwróconym zakresem, dzięki czemu zakres jest łatwiejszy do odczytania i bardziej zwarty:
Możesz zobaczyć pełną wersję kodu w tym streszczeniu: https://gist.github.com/sadmicrowave/d4fbefc124eb69027d7a3131526e8c06
źródło
[n for n in range(num, 0, -1)]
,range
jest już iterowalne.Innym sposobem jest użycie
np.prod
pokazanego poniżej:źródło
Silnia dodatniej liczby całkowitej n, oznaczonej przez n!, Jest iloczynem wszystkich dodatnich liczb całkowitych mniejszych lub równych n.
Formuła :
n! = n * (n-1) * (n-2) * (n-3) * (n-4) * ....... * 1
Istnieje kilka metod wyszukiwania silni w Pythonie przy użyciu wbudowanej funkcji / biblioteki itp. Tutaj utworzyłem funkcję zdefiniowaną przez użytkownika w odniesieniu do podstawowej definicji silni.
Możemy również zaimplementować funkcję silni za pomocą
recursive
techniki, jak pokazano poniżej. Ale ta metoda jest skuteczna tylko w przypadku małych wartości całkowitych. Ponieważ w rekurencji funkcja jest wywoływana wielokrotnie i wymaga miejsca w pamięci do utrzymania stosu, co nie jest wydajnym ani zoptymalizowanym podejściem do dużych wartości całkowitych w celu znalezienia silni.źródło
źródło
W poniższym kodzie wprowadzam liczbę, której silnię chcę obliczyć, a następnie mnożę -> liczbę, której silnię chcemy obliczyć z liczbami zaczynającymi się od 1,2, ...., (liczba, której silnia Chcę obliczyć -1)
źródło