Bagaimana cara saya menghitung faktorial dari bilangan bulat dengan Python?
Jawaban:
Cara termudah adalah dengan menggunakan math.factorial(tersedia di Python 2.6 dan yang lebih baru):
import math
math.factorial(1000)
Jika Anda ingin / harus menulisnya sendiri, Anda dapat menggunakan pendekatan berulang:
def factorial(n):
fact = 1
for num in range(2, n + 1):
fact *= num
return fact
atau pendekatan rekursif :
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
Perhatikan bahwa fungsi faktorial hanya ditentukan untuk bilangan bulat positif jadi Anda juga harus memeriksa itu n >= 0dan itu isinstance(n, int). Jika tidak, naikkan a ValueErroratau a TypeErrormasing - masing. math.factorialakan mengurus ini untukmu.
RecursionErroruntuk bilangan apa pun yang lebih besar dari 998 (coba factorial(999)) kecuali Anda meningkatkan batas rekursi Python
Pada Python 2.6 dan yang lebih baru, coba:
import math
math.factorial(n)
floatke fungsi ini akan memunculkan a DeprecationWarning. Jika Anda ingin melakukan itu, Anda perlu mengonversi nmenjadi intsecara eksplisit:, math.factorial(int(n))yang akan membuang apa pun setelah desimal, jadi Anda mungkin ingin memeriksanyan.is_integer()
Solusi terpendek dan mungkin tercepat adalah:
from math import factorial
print factorial(1000)
Anda juga dapat membuat solusi Anda sendiri. Umumnya Anda memiliki dua pendekatan. Salah satu yang paling cocok untuk saya adalah:
from itertools import imap
def factorial(x):
return reduce(long.__mul__, imap(long, xrange(1, x + 1)))
print factorial(1000)
(ini juga berlaku untuk angka yang lebih besar, jika hasilnya menjadi long)
Cara kedua untuk mencapai hal yang sama adalah:
def factorial(x):
result = 1
for i in xrange(2, x + 1):
result *= i
return result
print factorial(1000)
def factorial(n):
if n < 2:
return 1
return n * factorial(n - 1)
factorial(999)(dan di atasnya) akan menaikkan nilai a RuntimeErrorkecuali Anda meningkatkan batas rekursi Python
Jika Anda menggunakan Python2.5 atau lebih lama, coba
from operator import mul
def factorial(n):
return reduce(mul, range(1,n+1))
untuk Python yang lebih baru, ada faktorial dalam modul matematika seperti yang diberikan dalam jawaban lain di sini
reducetelah dihapus dari Python 3.
from functools import reduce
def fact(n, total=1):
while True:
if n == 1:
return total
n, total = n - 1, total * n
cProfile.run('fact(126000)')
4 function calls in 5.164 seconds
Menggunakan stack memang nyaman (seperti panggilan rekursif), tetapi ada biaya yang harus dikeluarkan: menyimpan informasi mendetail dapat menghabiskan banyak memori.
Jika stack tinggi, artinya komputer menyimpan banyak informasi tentang pemanggilan fungsi.
Metode ini hanya membutuhkan memori konstan (seperti iterasi).
def fact(n):
result = 1
for i in range(2, n + 1):
result *= i
return result
cProfile.run('fact(126000)')
4 function calls in 4.708 seconds
def fact(n):
return math.factorial(n)
cProfile.run('fact(126000)')
5 function calls in 0.272 seconds
factorialdalamfactorialfungsi tersebut. Bagaimana Anda bisa menggunakan fungsi yang sama dalam fungsi yang saat ini Anda definisikan? Saya baru mengenal Python jadi saya hanya mencoba untuk mengerti.