階乘 N! = N × (N-1) × ... × 1,0! = 1。遞迴定義自然對應數學歸納:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
for i in range(6):
print(f"{i}! = {factorial(i)}")
# 0! = 1
# 1! = 1
# 2! = 2
# 3! = 6
# 4! = 24
# 5! = 120
Python 預設遞迴上限 1000,計算 1000! 會觸發 RecursionError。解決:
reduce(operator.mul, range(1, n+1), 1) 或 math.factorial。sys.setrecursionlimit(2000) (謹慎使用)。
def fact_tail(n, acc=1):
if n == 0:
return acc
return fact_tail(n-1, n*acc) # Python 不會優化,仍會堆疊
| 方法 | 時間複雜度 | 空間複雜度 | 備註 |
|---|---|---|---|
| 遞迴 | O(N) | O(N) | 堆疊溢位風險 |
| 迴圈 | O(N) | O(1) | 推薦生產環境 |
| math.factorial | O(N log N) | O(1) | C 實作,最快 |
遞迴階乘適合教學展示遞迴概念,實務請用 math.factorial。