Function for factorial in Python
Categories:
Implementing the Factorial Function in Python

Explore various methods to calculate the factorial of a non-negative integer in Python, from iterative and recursive approaches to using built-in modules.
The factorial of a non-negative integer n
, denoted by n!
, is the product of all positive integers less than or equal to n
. For example, 5! = 5 * 4 * 3 * 2 * 1 = 120
. The factorial of 0 is defined as 1 (0! = 1
). This mathematical function is fundamental in combinatorics, probability, and various algorithms. In Python, there are several ways to implement this function, each with its own advantages and use cases.
Iterative Approach
The iterative approach calculates the factorial by repeatedly multiplying numbers from 1 up to n
. This method is generally preferred for its efficiency and avoidance of recursion depth limits, especially for larger input values. It's straightforward to understand and implement using a simple loop.
def factorial_iterative(n):
if not isinstance(n, int) or n < 0:
raise ValueError("Input must be a non-negative integer.")
if n == 0:
return 1
result = 1
for i in range(1, n + 1):
result *= i
return result
print(f"Factorial of 5 (iterative): {factorial_iterative(5)}")
print(f"Factorial of 0 (iterative): {factorial_iterative(0)}")
Iterative implementation of the factorial function.
flowchart TD A[Start] B{Is n < 0 or not integer?} C[Raise ValueError] D{Is n == 0?} E[Return 1] F[Initialize result = 1] G[Loop from i = 1 to n] H[result = result * i] I[Return result] A --> B B -- Yes --> C B -- No --> D D -- Yes --> E D -- No --> F F --> G G -- Loop continues --> H H --> G G -- Loop ends --> I
Flowchart of the iterative factorial calculation.
Recursive Approach
Recursion is a programming technique where a function calls itself to solve a smaller instance of the same problem. For factorial, the base case is 0! = 1
, and the recursive step is n! = n * (n-1)!
. While elegant, recursive solutions can consume more memory due to function call stack overhead and may lead to a RecursionError
for very large n
.
def factorial_recursive(n):
if not isinstance(n, int) or n < 0:
raise ValueError("Input must be a non-negative integer.")
if n == 0:
return 1
else:
return n * factorial_recursive(n - 1)
print(f"Factorial of 5 (recursive): {factorial_recursive(5)}")
print(f"Factorial of 0 (recursive): {factorial_recursive(0)}")
Recursive implementation of the factorial function.
math.factorial
is safer to prevent RecursionError
.Using Python's math
Module
For a robust and optimized solution, Python's built-in math
module provides a factorial()
function. This is the most efficient and recommended way to calculate factorials in production code, as it's implemented in C and handles edge cases and performance considerations internally.
import math
def factorial_math_module(n):
if not isinstance(n, int) or n < 0:
raise ValueError("Input must be a non-negative integer.")
return math.factorial(n)
print(f"Factorial of 5 (math module): {factorial_math_module(5)}")
print(f"Factorial of 0 (math module): {factorial_math_module(0)}")
Using math.factorial()
for calculating factorials.
math.factorial()
function raises a ValueError
if n
is negative or not an integer, aligning with the mathematical definition of factorial.