天天看點

遞歸函數、嵌套函數

遞歸函數

遞歸函數指的是:自己調用自己的函數,在函數體内部直接或間接的自己調用自己。遞歸類

似于數學的“數學歸納法”。 每個遞歸函數必須包含兩個部分:

1. 終止條件

表示遞歸什麼時候結束。一般用于傳回值,不再調用自己。

2. 遞歸步驟

把第 n 步的值和第 n-1 步相關聯。

遞歸函數由于會建立大量的函數對象、過量的消耗記憶體和運算能力。在處理大量資料時,謹

慎使用。

【操作】 使用遞歸函數計算階乘(factorial)

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

for i in range(1,6):
    print("{0}!={1}".format(i,factorial(i)))
    
執行結果:
1!=1
2!=2
3!=6
4!=24
5!=120
           

嵌套函數(内部函數)

嵌套函數: 在函數内部定義的函數!

【操作】 嵌套函數定義

def f1():
    print('f1 running...')

    def f2():
        print('f2 running...')
    f2()
f1()

執行結果:
f1 running... 
f2 running... 
           

上面程式中,f2()就是定義在 f1 函數内部的函數。f2()的定義和調用都在 f1()函數内部。

一般在什麼情況下使用嵌套函數

1. 封裝 - 資料隐藏

  外部無法通路“嵌套函數”。

2. 貫徹 DRY(Don’t Repeat Yourself) 原則

  嵌套函數,可以讓我們在函數内部避免重複代碼。

3. 閉包

【操作】使用嵌套函數避免重複代碼

def printChineseName(name,familyName):
    print("{0} {1}".format(familyName,name))
def printEnglishName(name,familyName):
    print("{0} {1}".format(name, familyName))

#使用 1 個函數代替上面的兩個函數
def printName(isChinese,name,familyName):
    def inner_print(a,b):
        print("{0} {1}".format(a,b))
    if isChinese:
        inner_print(familyName,name)
    else:
        inner_print(name,familyName)
printName(True,"狐沖","令")
printName(False,"David","Copperfield")

運作結果:
令 狐沖
David  Copperfield
           

繼續閱讀