ฟังก์ชันสำหรับ Factorial ใน Python


คำตอบ:


195

วิธีที่ง่ายที่สุดคือใช้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จะดูแลสิ่งนี้ให้คุณ


2
ฉันไม่เข้าใจว่าคุณสามารถใช้factorialภายในfactorialฟังก์ชันนี้ได้อย่างไร คุณจะใช้ฟังก์ชันเดียวกันภายในฟังก์ชันที่คุณกำลังกำหนดได้อย่างไร? ฉันยังใหม่กับ Python ดังนั้นฉันแค่พยายามทำความเข้าใจ
J82

8
@ J82: แนวคิดที่ใช้ในที่นี้เรียกว่าการเรียกซ้ำ ( en.wikipedia.org/wiki/Recursion_(computer_science) ) - ฟังก์ชันที่เรียกตัวเองนั้นใช้ได้อย่างสมบูรณ์แบบและมักจะมีประโยชน์
schnaader

ฟังก์ชันเรียกซ้ำจะเพิ่มRecursionErrorจำนวนใด ๆ ที่มากกว่า 998 (ลองfactorial(999)) เว้นแต่คุณจะเพิ่มขีด จำกัด การเรียกซ้ำของ Python
Boris

114

ใน Python 2.6 ขึ้นไปให้ลอง:

import math
math.factorial(n)

เริ่มต้นด้วย Python 3.9 การส่งผ่านfloatไปยังฟังก์ชันนี้จะเพิ่มไฟล์DeprecationWarning. หากคุณต้องการทำเช่นนั้นคุณต้องแปลงnเป็นแบบintชัดแจ้ง: math.factorial(int(n))ซึ่งจะทิ้งอะไรก็ตามหลังทศนิยมดังนั้นคุณอาจต้องการตรวจสอบว่าn.is_integer()
บอริส

18

โซลูชันที่มีอยู่

วิธีแก้ปัญหาที่สั้นที่สุดและเร็วที่สุดคือ:

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)


5

หากคุณใช้ Python2.5 หรือเก่ากว่าให้ลอง

from operator import mul
def factorial(n):
    return reduce(mul, range(1,n+1))

สำหรับ Python รุ่นใหม่มีแฟกทอเรียลในโมดูลคณิตศาสตร์ตามที่ระบุในคำตอบอื่น ๆ ที่นี่


1
นี่เป็นคำตอบเฉพาะของ Python 2 ซึ่งreduceถูกลบออกจาก Python 3
Boris

@Boris ใน Python3 คุณต้องเพิ่มfrom functools import reduce
John La Rooy

มันถูกลบด้วยเหตุผลคุณไม่ควรใช้มันartima.com/weblogs/viewpost.jsp?thread=98196
Boris


3

ด้วยเหตุผลด้านประสิทธิภาพโปรดอย่าใช้การเรียกซ้ำ มันจะหายนะ

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

1
ฉันคิดว่าสิ่งนี้ในขณะที่ลูปดูสะอาดขึ้นเล็กน้อย <! - language: python -> def fact (n): ret = 1 ในขณะที่ n> 1: n, ret = n - 1, ret * n return ret
edilio

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.