如何用Python遞迴函式求階乘?


一個數的階乘是所有從1到該數的所有正整數的乘積。例如,4的階乘是4*3*2*1 = 24。

為了使用Python遞迴函式求一個數的階乘,我們可以定義一個函式,該函式自身呼叫自身,並傳入更小的輸入,直到達到基本情況,即1的階乘為1。

以下是使用Python遞迴函式求階乘的程式碼:

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)

在這個程式碼中,函式`factorial(n)`接收一個數字`n`作為輸入,並返回該數字的階乘。第一個`if`語句檢查輸入數字`n`是否為1。如果`n`為1,則函式返回1作為基本情況。如果`n`不為1,則函式返回`n`和`n-1`的階乘的乘積。這就是遞迴函式呼叫發生的地方,函式自身呼叫自身,輸入為`n-1`。

要使用此函式,您可以簡單地用您想要查詢階乘的數字呼叫它,如下所示:

示例

求8的階乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(8))

輸出

40320

示例

以下程式碼計算n = 6和n = 15的階乘

def factorial(n):
   if n == 1:
      return 1
   else:
      res = n * factorial(n-1)
   return res
print ("factorial(6) = %d" %factorial(6))
print ("factorial(15) = %d" %factorial(15))

輸出

factorial(6) = 720
factorial(15) = 1307674368000

這是一個程式碼執行的示例:

示例

def factorial(n):
   if n==0 or n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(5))

輸出

120

為了理解函式是如何工作的,讓我們看看它如何找到5的階乘

函式被呼叫,輸入為5。

由於5不等於1,因此執行`else`塊。

函式返回5 * factorial(4)。

為了找到4的階乘,函式再次被呼叫,輸入為4。

由於4不等於1,因此執行`else`塊。

函式返回4 * factorial(3)。

為了找到3的階乘,函式再次被呼叫,輸入為3。

由於3不等於1,因此執行`else`塊。

函式返回3 * factorial(2)。

為了找到2的階乘,函式再次被呼叫,輸入為2。

由於2不等於1,因此執行`else`塊。

函式返回2 * factorial(1)。

為了找到1的階乘,函式再次被呼叫,輸入為1。

由於1等於1,因此執行`if`塊。

函式返回1作為基本情況。

之前的函式呼叫繼續被解析。

2 * factorial(1) is resolved to 2 * 1 = 2.
3 * factorial(2) is resolved to 3 * 2 = 6.
4 * factorial(3) is resolved to 4 * 6 = 24.
5 * factorial(4) is resolved to 5 * 24 = 120.

最終結果120被返回。

這個過程展示了函式如何使用遞迴重複呼叫自身,傳入更小的輸入,直到達到基本情況1,然後透過將每個輸入與其下一個較小輸入的階乘相乘來返回每個輸入的階乘。

以下是一些更多使用遞迴函式查詢不同數字階乘的示例:

示例

求7的階乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(7))

輸出

5040

示例

求10的階乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(10))

輸出

3628800

示例

求1的階乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(1))

輸出

1

示例

求0的階乘(注意,0的階乘定義為1)

def factorial(n):
   if n == 1 or n == 0:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(0))

輸出

1

這些示例展示瞭如何使用該函式來查詢不同數字的階乘,包括0和1的邊緣情況。

以下是一個更進一步的例子,說明該函式如何處理大型輸入:

示例

求20的階乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(20))

輸出

2432902008176640000

此示例表明該函式可以處理大型輸入,而不會出現錯誤或效能問題。但是,值得注意的是,對於非常大的輸入,遞迴函式可能會遇到堆疊溢位問題,或者執行時間非常長,因此在這些情況下,最好使用階乘函式的迭代實現。

以下是Python中階乘函式的迭代實現:

def factorial(n):
   result = 1
   for i in range(1, n+1):
      result *= i
   return result

在此實現中,該函式迭代從1到n的所有數字,將它們相乘以計算階乘。結果儲存在變數`result`中,該變數初始化為1。

要使用此函式,您可以用您想要查詢階乘的數字呼叫它,如下所示:

示例

def factorial(n):
   result = 1
   for i in range(1, n+1):
      result *= i
   return result
print(factorial(9))

輸出

362880

對於非常大的輸入,此迭代實現比遞迴實現具有一些優勢。首先,它不會遇到堆疊溢位問題,因為它不使用函式呼叫來計算階乘。其次,它通常比遞迴實現更快,因為它沒有函式呼叫和堆疊操作的開銷。但是,對於較小的輸入,遞迴實現可能更簡潔且更容易理解。

更新於:2023年5月2日

瀏覽量:554

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.