如何用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日

562 次瀏覽

開啟你的職業生涯

完成課程獲得認證

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