ฉันจะคำนวณแฟกทอเรียลของจำนวนเต็มใน Python ได้อย่างไร
ฉันจะคำนวณแฟกทอเรียลของจำนวนเต็มใน Python ได้อย่างไร
คำตอบ:
วิธีที่ง่ายที่สุดคือใช้math.factorial(มีใน Python 2.6 ขึ้นไป):
import math
math.factorial(1000)
หากคุณต้องการ / ต้องเขียนด้วยตัวเองคุณสามารถใช้วิธีการซ้ำ:
def factorial(n):
fact = 1
for num in range(2, n + 1):
fact *= num
return fact
หรือวิธีการเรียกซ้ำ :
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
โปรดทราบว่าฟังก์ชั่นปัจจัยที่ถูกกำหนดให้เฉพาะสำหรับจำนวนเต็มบวกดังนั้นคุณควรตรวจสอบว่าและว่าn >= 0 isinstance(n, int)ถ้าไม่ใช่ให้เพิ่มValueErrorหรือTypeErrorตามลำดับ math.factorialจะดูแลสิ่งนี้ให้คุณ
RecursionErrorจำนวนใด ๆ ที่มากกว่า 998 (ลองfactorial(999)) เว้นแต่คุณจะเพิ่มขีด จำกัด การเรียกซ้ำของ Python
ใน Python 2.6 ขึ้นไปให้ลอง:
import math
math.factorial(n)
floatไปยังฟังก์ชันนี้จะเพิ่มไฟล์DeprecationWarning. หากคุณต้องการทำเช่นนั้นคุณต้องแปลงnเป็นแบบintชัดแจ้ง: math.factorial(int(n))ซึ่งจะทิ้งอะไรก็ตามหลังทศนิยมดังนั้นคุณอาจต้องการตรวจสอบว่าn.is_integer()
วิธีแก้ปัญหาที่สั้นที่สุดและเร็วที่สุดคือ:
from math import factorial
print factorial(1000)
คุณยังสามารถสร้างโซลูชันของคุณเองได้ โดยทั่วไปคุณมีสองวิธี สิ่งที่เหมาะกับฉันที่สุดคือ:
from itertools import imap
def factorial(x):
return reduce(long.__mul__, imap(long, xrange(1, x + 1)))
print factorial(1000)
(ใช้ได้กับตัวเลขที่ใหญ่กว่าเมื่อผลลัพธ์กลายเป็นlong)
วิธีที่สองในการบรรลุเป้าหมายเดียวกันคือ:
def factorial(x):
result = 1
for i in xrange(2, x + 1):
result *= i
return result
print factorial(1000)
หากคุณใช้ Python2.5 หรือเก่ากว่าให้ลอง
from operator import mul
def factorial(n):
return reduce(mul, range(1,n+1))
สำหรับ Python รุ่นใหม่มีแฟกทอเรียลในโมดูลคณิตศาสตร์ตามที่ระบุในคำตอบอื่น ๆ ที่นี่
reduceถูกลบออกจาก Python 3
from functools import reduce
def fact(n):
f = 1
for i in range(1, n + 1):
f *= i
return f
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
การใช้สแต็กนั้นสะดวกสบาย (เช่นการเรียกซ้ำ) แต่มีค่าใช้จ่าย: การจัดเก็บข้อมูลโดยละเอียดอาจใช้หน่วยความจำมาก
ถ้าสแตกสูงแสดงว่าคอมพิวเตอร์เก็บข้อมูลจำนวนมากเกี่ยวกับการเรียกใช้ฟังก์ชัน
วิธีนี้ใช้เฉพาะหน่วยความจำคงที่ (เช่นการวนซ้ำ)
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
อีกวิธีในการทำคือใช้ที่np.prodแสดงด้านล่าง:
def factorial(n):
if n == 0:
return 1
else:
return np.prod(np.arange(1,n+1))
factorialภายในfactorialฟังก์ชันนี้ได้อย่างไร คุณจะใช้ฟังก์ชันเดียวกันภายในฟังก์ชันที่คุณกำลังกำหนดได้อย่างไร? ฉันยังใหม่กับ Python ดังนั้นฉันแค่พยายามทำความเข้าใจ