Alg2.1. 遞迴


對於遞迴的概念每個人的喜好都有所不同,例如:迴圈對於程式本身是有效益的,遞迴則是對程式設計師是有效益的,要使用那一個方式則端看那一種情況對使用者是更重要的。

Loops may achieve a performance gain for your program. Recursion may achieve a performance gain for your programmer. Choose which is more important in your situation! -- Leigh Caldwell

如同一個玩偶嵌套另一個玩偶的俄羅斯娃娃,若對應到遞迴則是一個函數會自已呼叫函數自已。此外,在使用遞迴函數時還需要知道什麼時候要繼續遞迴,或是什麼時候要停止遞迴及回傳結果。所以,遞迴函數內通常會有兩種情況:函數持續遞迴的遞迴情況 (recursive case) 及停止遞迴的基本情況 (basic case)。

def recusion(x):
    if 條件式:
        # 基本情況
        return value
    else:
        # 遞迴情況
        return recusion(計算式)
# 定義函數
def fact(x):
    if x == 1:
        print('f(x = {0})'.format(x))
        print('Basic case: x = 1, return 1')
        print()
        print('----')
        print()

        return 1                                        # x == 1 時為基本情況,則回傳 1
    else:
        print('f(x = {0})'.format(x))
        print('Recusive case: fact({0} - 1)'.format(x))
        print()

        fact_result = fact(x - 1)                       # x != 1 時為遞迴情況,則呼叫函數本身

        print('f(x = {0})'.format(x))                   # 此處為遞迴返迴處,回傳 x * f(x - 1)
        print('Return: {0} * fact({0} - 1) = {1}'.format(x, fact_result))
        print()
        return x * fact_result


# 呼叫函數
print(fact(3))


# 執行結果
f(x = 3)
Recusive case: fact(3 - 1)

f(x = 2)
Recusive case: fact(2 - 1)

f(x = 1)
Basic case: x = 1, return 1

----

f(x = 2)
Return: 2 * fact(2 - 1) = 1

f(x = 3)
Return: 3 * fact(3 - 1) = 2

6

參考資料

  • Recursion or Iteration?
  • 寫程式前就該懂的演算法, 第三章, Aditya Y.Bhargava著, 張書華譯, 松崗, ♥️

results matching ""

    No results matching ""