前言:代碼復(fù)用與函數(shù)遞歸是Python函數(shù)的較高階應(yīng)用,通過(guò)對(duì)代碼復(fù)用和函數(shù)遞歸的學(xué)習(xí),我們可以寫(xiě)出更為復(fù)雜或巧妙的函數(shù),從而使程序設(shè)計(jì)變得更加方便,對(duì)于解決相應(yīng)的問(wèn)題也有極大的幫助。但對(duì)于代碼復(fù)用與函數(shù)遞歸的理解十分抽象,所以在這一模塊應(yīng)反復(fù)摸索,直到靈活使用。

Ⅰ代碼復(fù)用:
概念:把代碼當(dāng)成資源進(jìn)行抽象
①、代碼資源化:程序代碼是一種用來(lái)表達(dá)計(jì)算的資源;
②、代碼抽象化:使用函數(shù)等方法對(duì)代碼賦予更高級(jí)別的定義;
③、代碼復(fù)用:同一份代碼在需要時(shí)可以被重復(fù)使用;
Ⅱ 模塊化設(shè)計(jì):
概念:通過(guò)函數(shù)或?qū)ο蠓庋b將程序劃分為模塊及模塊間的表達(dá)
緊耦合與松耦合
①緊耦合:兩個(gè)部分之間交流很多,無(wú)法獨(dú)立存在
②松耦合:兩個(gè)部分之間交流較少,可以獨(dú)立存在
模塊內(nèi)部緊耦合,模塊之間松耦合。
★Ⅲ函數(shù)遞歸:
概念:函數(shù)定義中調(diào)用函數(shù)自身的方式
(1)函數(shù)遞歸的兩個(gè)關(guān)鍵特征:
①鏈條:函數(shù)計(jì)算過(guò)程中存在鏈條
②基例:存在一個(gè)或多個(gè)不需要再次遞歸的基例
(2):函數(shù)遞歸的調(diào)用過(guò)程:
函數(shù)+分支語(yǔ)句
例:

如以上代碼所示,當(dāng)n≠0時(shí),我們用return返回到n*fact(n
- 1),直到n=0時(shí),返回1,則相當(dāng)于我們算出了n?。╪的階乘)。
函數(shù)遞歸實(shí)例解析:
-函數(shù)+分支結(jié)構(gòu)
-遞歸鏈條
-遞歸基例
基本步驟:

例① 字符串反轉(zhuǎn):

解析:首先定義一個(gè)函數(shù)rvs,它的參數(shù)就是字符串s,接著構(gòu)造if、else的分支結(jié)構(gòu)判斷基例,如果s為空字符串,則它的反轉(zhuǎn)就是它自己;如果字符串不是空,我們需要確定遞歸鏈條,即當(dāng)前操作和之前的一步之間的關(guān)系,為了將s反轉(zhuǎn),我們可以將首字符放在其余字符的后面,不斷執(zhí)行該過(guò)程則實(shí)現(xiàn)了s整個(gè)字符串的反轉(zhuǎn)。通過(guò)將該函數(shù)進(jìn)行調(diào)用:

我們可以得到:

例② 斐波那契數(shù)列的實(shí)現(xiàn):
問(wèn)題描述:斐波那契數(shù)列指的是這樣一個(gè)數(shù)列0, 1, 1, 2, 3, 5, 8, 13,特別指出:第0項(xiàng)是0,第1項(xiàng)是第一個(gè)1。從第三項(xiàng)開(kāi)始,每一項(xiàng)都等于前兩項(xiàng)之和。根據(jù)信息分析鏈條與基例寫(xiě)出程序:

通過(guò)調(diào)用該函數(shù),我們可以得到斐波那契數(shù)列的任意一項(xiàng):


例③ 漢諾塔問(wèn)題:
問(wèn)題描述:漢諾塔問(wèn)題是一個(gè)經(jīng)典的問(wèn)題。漢諾塔(Hanoi Tower),源于印度一個(gè)古老傳說(shuō)。大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤(pán)。大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,任何時(shí)候,在小圓盤(pán)上都不能放大圓盤(pán),且在三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)。問(wèn)應(yīng)該如何操作?

問(wèn)題分析:
漢諾塔解法總結(jié)起來(lái)有三步驟:
設(shè)一共有N個(gè)盤(pán)子:
(1)把 N-1個(gè)盤(pán)子 移到中轉(zhuǎn)柱(2)把第N個(gè)盤(pán)子移動(dòng)到 目標(biāo)柱(3)把中轉(zhuǎn)柱上面的N-1個(gè)盤(pán)子借助目前空閑的柱子移動(dòng)到 目標(biāo)柱。
Ps:以上的中轉(zhuǎn)柱,起始柱,是會(huì)變化的。每一層遞歸的邏輯都是,借助"目標(biāo)柱子",將n-1個(gè)盤(pán)子移動(dòng)到 “中轉(zhuǎn)柱”,然后再將最后一個(gè)盤(pán)子移動(dòng)到"目標(biāo)柱子",再將中轉(zhuǎn)柱上的盤(pán)子按照同樣的規(guī)律移動(dòng)到"目標(biāo)柱子"。使用代碼表示出思路:

運(yùn)行:

我們就可以得到三個(gè)盤(pán)子的移動(dòng)規(guī)律和需要的步數(shù)。
總結(jié):Python函數(shù)的代碼復(fù)用和函數(shù)遞歸理解起來(lái)相對(duì)困難,但可以從給出的實(shí)例看出,它們確實(shí)更加快捷準(zhǔn)確地解決了較為復(fù)雜的問(wèn)題。一分耕耘,一分收獲。通過(guò)對(duì)代碼復(fù)用和函數(shù)遞歸的學(xué)習(xí)與理解,一定會(huì)讓我們的編程思路大大提高?。?/p>