如何在 Python 中建立遞迴函式?


遞迴是一種程式設計技巧,其中函式在其主體中呼叫自身一次或多次。通常,它會返回此函式呼叫的返回值。如果函式定義遵循遞迴,我們稱此函式為遞迴函式。

一個遞迴函式必須在程式中使用之前終止。如果每次遞迴呼叫,問題的解決都變得更小並朝著基本情況發展,則它會終止,在基本情況中,可以無需進一步遞迴即可解決問題。如果在呼叫中不滿足基本情況,遞迴會導致無限迴圈。

我們使用 Python 中的遞迴函式來解決現實世界的數學問題。

前 n 個自然數之和

以下程式碼使用遞迴 Python 函式返回前 n 個自然數之和。

示例

這將列印前 100 個自然數和前 500 個自然數的和

def sum_n(n):
   if n== 0:
       return 0 
   else:
      return n + sum_n(n-1)
print(sum_n(100)) 
print(sum_n(500))

輸出

5050
125250

使用遞迴的階乘函式

遞迴函式是指重複呼叫自身直到達到停止遞迴的基本情況的函式。讓我們考慮一個 Python 中簡單遞迴函式的示例,該函式計算給定數字的階乘

在這裡,階乘函式採用正整數 n 作為引數,並返回該數字的階乘。如果 n 等於 0,則函式返回 1,這是基本情況。否則,函式會遞迴呼叫自身,引數為 n-1,並將結果乘以 n。遞迴將持續進行,直到達到基本情況。

示例

這將呼叫階乘函式,引數為 5,它將返回 5 * 4 * 3 * 2 * 1 = 120。

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

輸出

120

使用遞迴的斐波那契數列

在此示例中,斐波那契函式採用非負整數 n 作為引數,並返回斐波那契數列中的第 n 個數。如果 n 等於 0,則函式返回 0。如果 n 等於 1,則函式返回 1。否則,函式會遞迴呼叫自身,引數為 n-1 和 n-2,並返回結果之和。遞迴將持續進行,直到達到基本情況。

示例

這將呼叫斐波那契函式,引數為 6,它將返回斐波那契數列中的第 6 個數,即 8。

def fibonacci(n):
   if n == 0:
      return 0 
   elif n == 1:
      return 1
   else:
      return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(6))

輸出

8

如何查詢數字的最大公約數

Python 中另一個查詢兩個正整數的最大公約數 (GCD) 的遞迴函式示例如下

在此示例中,gcd 函式採用兩個正整數 a 和 b 作為引數,並返回它們的最大公約數。如果 b 等於 0,則函式返回 a,這是基本情況。否則,函式會遞迴呼叫自身,引數為 b 和 a % b,其中 % 是模運算子,並返回結果。遞迴將持續進行,直到達到基本情況。

示例

這將呼叫 gcd 函式,引數為 24 和 36,它將返回它們的最大公約數,即 12。

def gcd(a, b):
   if b == 0:
      return a 
   else:
       return gcd(b, a % b) 
print(gcd(24, 36))

輸出

12

計算正整數的數字之和

在此示例中,sum_digits 函式採用正整數 n 作為引數,並返回其數字之和。如果 n 小於 10,則函式返回 n,這是基本情況。否則,函式將 n 的最後一位數字新增到使用整數除法 (// 運算子) 將 n 除以 10 得到的數字之和中,並使用結果遞迴呼叫自身。遞迴將持續進行,直到達到基本情況。

示例

這將呼叫 sum_digits 函式,引數為 12345,它將返回其數字之和,即 1 + 2 + 3 + 4 + 5 = 15。

def sum_digits(n):
   if n < 10:
      return n
   else:
      return n % 10 + sum_digits(n // 10) 
print(sum_digits(12345))

輸出

15

查詢字串的長度

在此示例中,string_length 函式採用字串 s 作為引數,並返回其長度。如果 s 是空字串 (''), 則函式返回 0,這是基本情況。否則,函式將 1 新增到透過切片第一個字元 (s[0]) 並使用剩餘字串 (s[1:]) 遞迴呼叫 string_length 函式獲得的字串長度中。遞迴將持續進行,直到達到基本情況。

示例

def string_length(s):
   if s == '':
      return 0
   else:
      return 1 + string_length(s[1:])
print(string_length('hello world'))

輸出

11

這將呼叫 string_length 函式,引數為 'hello world',它將返回其長度,即 11。

遞迴函式可以為某些型別的問題提供強大而優雅的解決方案,但如果設計不當,它們也可能導致無限遞迴。務必仔細考慮基本情況並確保函式最終會達到它。

更新於: 2023-09-28

3K+ 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告