12. 遞迴函式

(1) 計算 n!

以下是一個例子:

def factorial(n):
    if not isinstance(n, int):
        raise TypeError('型態錯誤!')

    if n < 0:
        raise ValueError('值錯誤')
    
    if n==1:
        return 1
    else:
        return n * factorial(n-1)
 
#-----------------------------------
print(factorial(10))  

第11行,factorial(n-1)呼叫自己,但是傳遞的引數遞減1。

執行結果:

3628800

說明

(2) 計算費氏數列的第n個值

以下是一個例子:

def fibonacci(n):
    if not isinstance(n, int):
        raise TypeError('型態錯誤!')

    if n < 0:
        raise ValueError('值錯誤')
    
    if n<=1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)
 
#-----------------------------------
print(fibonacci(9))   

第8, 9行,第0個值是0;第1個值是1。 第11行,費氏數列第n個值 = 第n-1的值 + 第n-2的值。

執行結果:

34

說明:

問題:

用recursive的方法寫一個夏季電費函式summer(degree),計算並回傳電費,各分段收費如下。電費以不同分段之標準收費,如使用電費500度,則前300度每度3.02元,後200度每度5.44元。

 .................................
                     每度(元)   
 .................................
 330度(含)以下         3.02               
 331-700度            5.44        
 701-1000度           6.16         
 1001度(含)以上        6.71         
 .................................

測試主程式:

print(f'{summer(1200):,.0f}元')
print(f'{summer(850):,.0f}元')
print(f'{summer(550):,.0f}元')
print(f'{summer(425):,.0f}元')
print(f'{summer(215):,.0f}元')

測試結果範例:

6,200元 3,934元 2,194元 1,514元 650元