Bagaimana cara saya menghitung faktorial dari bilangan bulat dengan Python?
140
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 >= 0
dan itu isinstance(n, int)
. Jika tidak, naikkan a ValueError
atau a TypeError
masing - masing. math.factorial
akan mengurus ini untukmu.
factorial
dalamfactorial
fungsi 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.RecursionError
untuk bilangan apa pun yang lebih besar dari 998 (cobafactorial(999)
) kecuali Anda meningkatkan batas rekursi PythonPada Python 2.6 dan yang lebih baru, coba:
import math math.factorial(n)
sumber
float
ke fungsi ini akan memunculkan aDeprecationWarning
. Jika Anda ingin melakukan itu, Anda perlu mengonversin
menjadiint
secara eksplisit:,math.factorial(int(n))
yang akan membuang apa pun setelah desimal, jadi Anda mungkin ingin memeriksanyan.is_integer()
Solusi yang ada
Solusi terpendek dan mungkin tercepat adalah:
from math import factorial print factorial(1000)
Bangun sendiri
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)
sumber
def factorial(n): if n < 2: return 1 return n * factorial(n - 1)
sumber
factorial(999)
(dan di atasnya) akan menaikkan nilai aRuntimeError
kecuali Anda meningkatkan batas rekursi PythonJika 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
sumber
reduce
telah dihapus dari Python 3.from functools import reduce
def fact(n): f = 1 for i in range(1, n + 1): f *= i return f
sumber
Untuk alasan kinerja, jangan gunakan rekursi. Ini akan menjadi bencana.
def fact(n, total=1): while True: if n == 1: return total n, total = n - 1, total * n
Periksa hasil yang sedang berjalan
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).
Atau Menggunakan for loop
def fact(n): result = 1 for i in range(2, n + 1): result *= i return result
Periksa hasil yang sedang berjalan
cProfile.run('fact(126000)')
4 function calls in 4.708 seconds
Atau Menggunakan matematika fungsi builtin
def fact(n): return math.factorial(n)
Periksa hasil yang sedang berjalan
cProfile.run('fact(126000)')
5 function calls in 0.272 seconds
sumber
Cara lain untuk melakukannya adalah dengan menggunakan yang
np.prod
ditunjukkan di bawah ini:def factorial(n): if n == 0: return 1 else: return np.prod(np.arange(1,n+1))
sumber