版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章函數(shù)
目錄1.函數(shù)的概念2.參數(shù)與返回值3.參數(shù)的類型4.lambda函數(shù)5.變量的作用域6.遞歸1當(dāng)程序的長(zhǎng)度在幾十行甚至超過百行時(shí),如果不劃分模塊,程序的可讀性是非常糟糕的。解決這一問題的最好的方法就是一段程序劃分為若干個(gè)短小的程序段,每一段完成一個(gè)功能。函數(shù)就是這種程序段的具體實(shí)現(xiàn)。
函數(shù)的概念1Python中的函數(shù)包括內(nèi)置函數(shù)、標(biāo)準(zhǔn)庫(kù)函數(shù)、第三方庫(kù)、用戶自定義函數(shù)等。內(nèi)置函數(shù):Python提供的,安裝Python后即可直接使用的函數(shù),如print()、int(),len()等。標(biāo)準(zhǔn)庫(kù)函數(shù):通過import導(dǎo)入對(duì)應(yīng)庫(kù)即可使用,如math庫(kù),random庫(kù)。第三方庫(kù):需要先安裝,然后import導(dǎo)入,然后使用,如jieba庫(kù)。用戶自定義函數(shù):需程序員通過def關(guān)鍵字先定義該函數(shù),并編寫對(duì)應(yīng)功能的實(shí)現(xiàn)代碼,然后才可以通過調(diào)用語句進(jìn)行使用。
函數(shù)的概念1函數(shù)必須“先定義,后使用”。對(duì)函數(shù)進(jìn)行定義,指定它的名字、函數(shù)返回值類型、函數(shù)實(shí)現(xiàn)的功能以及參數(shù)的個(gè)數(shù)與類型。在程序執(zhí)行自定義函數(shù)時(shí),按照定義時(shí)所指定的功能執(zhí)行。1.1函數(shù)的定義和調(diào)用
函數(shù)的概念11.1函數(shù)的定義和調(diào)用Python使用def保留字定義一個(gè)函數(shù),語法形式如下:
def<函數(shù)名>(<形參列表>):<函數(shù)體>return<返回值>def是關(guān)鍵字,用于定義一個(gè)函數(shù);函數(shù)名可以是任何有效的Python標(biāo)識(shí)符;形參列表是調(diào)用函數(shù)時(shí)傳遞給它的值,可以有零個(gè)、一個(gè)或者多個(gè),當(dāng)參數(shù)為多個(gè)時(shí),參數(shù)之間用逗號(hào)隔開;
函數(shù)的概念11.1函數(shù)的定義和調(diào)用Python使用def保留字定義一個(gè)函數(shù),語法形式如下:
def<函數(shù)名>(<形參列表>):<函數(shù)體>return<返回值>函數(shù)體是指每次調(diào)用函數(shù)執(zhí)行的代碼,由一行或者多行代碼組成。當(dāng)函數(shù)需要返回值時(shí),用return保留字和返回值組成,返回值表示調(diào)用該函數(shù)返回的值;當(dāng)函數(shù)不需要返回值時(shí),函數(shù)中沒有return保留字和返回值。
函數(shù)的概念1示例:定義一個(gè)函數(shù)求兩個(gè)點(diǎn)的歐氏距離:importmathdefdistance(point1,point2): #定義函數(shù) x1,y1=point1 #獲取點(diǎn)坐標(biāo) x2,y2=point2 d=math.sqrt((x2-x1)**2+(y2-y1)**2) returnd #返回兩點(diǎn)距離
上述代碼表示定義了一個(gè)函數(shù)名為distance的函數(shù),形參列表為point1,point2兩個(gè)參數(shù),函數(shù)體為獲取兩點(diǎn)的坐標(biāo)、計(jì)算兩點(diǎn)之間的歐式距離并將結(jié)果賦值給distance,返回值為distance。
函數(shù)的概念11.2調(diào)用函數(shù)的調(diào)用的格式如下:函數(shù)名([<實(shí)參列表>])<實(shí)參列表>為待傳遞給函數(shù)執(zhí)行的數(shù)據(jù)。函數(shù)只有被調(diào)用后,函數(shù)才會(huì)開始執(zhí)行。每調(diào)用一次函數(shù),函數(shù)中定義的函數(shù)體執(zhí)行一遍。如果需要多次執(zhí)行函數(shù)的功能,只需要多次調(diào)用該函數(shù)即可。
函數(shù)的概念1.1對(duì)上述定義的求歐式距離函數(shù)distance進(jìn)行調(diào)用,下面演示調(diào)用兩次:pointA=(1,2) #指定點(diǎn)A坐標(biāo)pointB=(4,6) #指定點(diǎn)B坐標(biāo)d1=distance(pointA,pointB) #調(diào)用函數(shù),計(jì)算AB兩點(diǎn)距離print(d1) #打印AB兩點(diǎn)距離pointC=(-1,-2) #指定點(diǎn)C坐標(biāo)pointD=(6,4) #指定點(diǎn)D坐標(biāo)d2=distance(pointC,pointD)#調(diào)用函數(shù),計(jì)算CD兩點(diǎn)距離print("%.2f"%d2) #打印CD兩點(diǎn)距離,并保留兩位小數(shù)
====================RESTART:D:/python/ch5/1.py=====================59.22
函數(shù)的概念11.2函數(shù)的調(diào)用過程在程序中調(diào)用函數(shù)需要執(zhí)行以下四個(gè)步驟。調(diào)用處暫停:在需要使用該函數(shù)的地方,可以直接使用函數(shù)名稱后加圓括號(hào)來調(diào)用函數(shù),原程序處暫停執(zhí)行。傳遞參數(shù):如果函數(shù)有參數(shù),需要在函數(shù)調(diào)用時(shí)傳遞相應(yīng)的參數(shù)。執(zhí)行函數(shù)體代碼:函數(shù)被調(diào)用時(shí),程序會(huì)從函數(shù)定義的地方開始執(zhí)行函數(shù)體內(nèi)的代碼。返回結(jié)果:函數(shù)執(zhí)行完成后,可以通過return語句返回一個(gè)結(jié)果,如果沒有return語句,則返回None。
函數(shù)的概念11.2函數(shù)的調(diào)用過程程序調(diào)用的分解圖如圖1所示,1表示調(diào)用distance函數(shù),程序暫停,2表示將實(shí)參賦值給形參,3表示執(zhí)行函數(shù)體中的內(nèi)容,4表示返回值賦值給d1,程序回到暫停處并繼續(xù)執(zhí)行下面程序。圖1函數(shù)的調(diào)用過程
函數(shù)的概念2參數(shù)與返回值形式參數(shù)(Parameters)是在函數(shù)(也稱為被調(diào)函數(shù))定義時(shí)聲明的變量,用于接收函數(shù)(也稱為主調(diào)函數(shù))調(diào)用時(shí)傳遞的值,簡(jiǎn)稱“形參”。形參的作用是定義函數(shù)需要接收的數(shù)據(jù)類型和數(shù)量,以及參數(shù)的名稱。實(shí)際參數(shù)(Arguments)是在函數(shù)調(diào)用時(shí)實(shí)際傳遞的值,用于給形參賦值,簡(jiǎn)稱“實(shí)參”。實(shí)參的作用是提供給函數(shù)執(zhí)行所需的具體數(shù)據(jù)。2.1實(shí)參與形參2參數(shù)與返回值2.2實(shí)參與形參的傳遞實(shí)參和形參的內(nèi)存地址不會(huì)直接改變。當(dāng)傳遞一個(gè)對(duì)象作為參數(shù)時(shí),實(shí)參與形參將引用同一個(gè)對(duì)象的內(nèi)存地址。這意味著在函數(shù)內(nèi)部對(duì)該對(duì)象的任何修改都會(huì)影響到實(shí)參。當(dāng)傳遞的值是不可變的對(duì)象(例如整數(shù)、字符串和元組)時(shí),如果函數(shù)體不修改變量的值,那么實(shí)參和形參指向同一內(nèi)存地址,即實(shí)參與形參相統(tǒng)一。2參數(shù)與返回值示例:不可變對(duì)象實(shí)參與形參相統(tǒng)一當(dāng)調(diào)用函數(shù)newa=func(origa,origb),將兩個(gè)實(shí)參origa和origb分別傳給形參a、b,由于func函數(shù)體未對(duì)第一個(gè)變量進(jìn)行修改,因此,origa和a指向相同的內(nèi)存地址,如圖2所示,此時(shí)稱為實(shí)參與形參相統(tǒng)一。圖2不可變類型實(shí)參與形參相統(tǒng)一示意圖2參數(shù)與返回值示例:不可變對(duì)象實(shí)參與形參不統(tǒng)一圖3不可變類型實(shí)參與形參不統(tǒng)一當(dāng)函數(shù)體執(zhí)行b=a+b時(shí),變量b發(fā)生變化并指向新的內(nèi)存地址,如圖3所示,此時(shí)內(nèi)存地址已發(fā)生改變,origb和b指向不同的內(nèi)存地址,此時(shí)稱為實(shí)參與形參不統(tǒng)一。2參數(shù)與返回值當(dāng)傳遞的值是可變的對(duì)象(例如列表、字典等)時(shí),如果實(shí)參和形參指向相同的內(nèi)存地址,則稱為實(shí)參與形參相統(tǒng)一。示例:可變類型實(shí)參和形參相統(tǒng)一在函數(shù)體中,雖然對(duì)列表進(jìn)行添加操作,但是并未改變列表的內(nèi)存地址,因此,仍稱實(shí)參和形參相統(tǒng)一。2參數(shù)與返回值示例:可變類型實(shí)參和形參不統(tǒng)一在函數(shù)體中,對(duì)傳入的列表進(jìn)行重新賦值,改變了列表的內(nèi)存地址如圖4所示,此時(shí)稱實(shí)參和形參不統(tǒng)一。圖4可變類型實(shí)參和形參不統(tǒng)一2參數(shù)與返回值2.3函數(shù)的返回值Python函數(shù)的返回值指的是被調(diào)函數(shù)在執(zhí)行完畢后通過return語句返回的值。返回值可以是任意類型的對(duì)象,包括數(shù)字、字符串、布爾值、列表、字典、元組等。函數(shù)也可以沒有返回值。即完成某項(xiàng)任務(wù)后就結(jié)束。2參數(shù)與返回值示例:兩個(gè)數(shù)的加法并將結(jié)果返回add()函數(shù)接收兩個(gè)參數(shù)a和b,將它們相加得到result,然后使用return語句將result作為返回值返回給調(diào)用者。2參數(shù)與返回值示例:函數(shù)返回多個(gè)值calculate()函數(shù)接收兩個(gè)參數(shù)a和b,然后計(jì)算它們的和sum和差diff,最后使用return語句返回一個(gè)包含sum和diff的元組。2參數(shù)與返回值2.4無參函數(shù)無參函數(shù)是指在定義函數(shù)時(shí),函數(shù)名后面括號(hào)中沒有參數(shù)列表,即函數(shù)沒有參數(shù)。無參函數(shù)可以用來執(zhí)行一些不需要輸入?yún)?shù)的操作,例如,打印輸出、獲取當(dāng)前時(shí)間等。語法格式:2參數(shù)與返回值示例:定義一個(gè)函數(shù)實(shí)現(xiàn)程序初始化。welcome()函數(shù)沒有任何參數(shù),調(diào)用時(shí),會(huì)執(zhí)行函數(shù)體的內(nèi)容,打印輸出。2參數(shù)與返回值示例:定義一個(gè)函數(shù)實(shí)現(xiàn)獲取當(dāng)前時(shí)間get_current_date()函數(shù)沒有任何參數(shù),當(dāng)調(diào)用時(shí)會(huì)返回當(dāng)前的日期。3參數(shù)的類型Python中可使用不同的參數(shù)類型來調(diào)用函數(shù)。參數(shù)類型包括:位置參數(shù)、默認(rèn)值參數(shù)、關(guān)鍵字參數(shù)和可變長(zhǎng)度參數(shù)。3.1位置參數(shù)函數(shù)調(diào)用時(shí)的參數(shù)一般采用按位置匹配的方式,即在函數(shù)調(diào)用時(shí),實(shí)參按順序傳遞給函數(shù)定義時(shí)相應(yīng)位置的形參,兩者的數(shù)目和順序必須完全一致。2參數(shù)與返回值示例:位置參數(shù)greet()函數(shù)接受兩個(gè)位置參數(shù)name和age。在調(diào)用函數(shù)時(shí),按照定義的順序傳遞相應(yīng)的參數(shù)值。調(diào)用greet()函數(shù):2參數(shù)與返回值示例:位置參數(shù)如果在調(diào)用函數(shù)時(shí)不按照定義的順序傳遞參數(shù)值,將會(huì)導(dǎo)致錯(cuò)誤。3參數(shù)的類型3.2默認(rèn)參數(shù)默認(rèn)參數(shù)是指在函數(shù)定義時(shí)給參數(shù)設(shè)置一個(gè)默認(rèn)值,執(zhí)行函數(shù)時(shí)如果沒有傳入該參數(shù)的值,則使用默認(rèn)值。默認(rèn)參數(shù)的定義方式是在函數(shù)定義時(shí),使用賦值操作符“=”為參數(shù)設(shè)置默認(rèn)值。3參數(shù)的類型示例:默認(rèn)參數(shù)greeting()函數(shù)有兩個(gè)參數(shù),name和age。age參數(shù)是一個(gè)默認(rèn)參數(shù),其默認(rèn)值為20。當(dāng)調(diào)用函數(shù)時(shí)只傳入一個(gè)參數(shù)name時(shí),age參數(shù)會(huì)使用默認(rèn)值20。3參數(shù)的類型示例:默認(rèn)值必須從最右邊開始默認(rèn)值必須從最右邊開始。第一次函數(shù)調(diào)用使用位置參數(shù),依次給a,b,c賦值為1,2,3。第二次只有兩個(gè)參數(shù),按默認(rèn)從最右邊開始的原則,c取默認(rèn)值2,a,b分別被賦值為10,20。第三次調(diào)用進(jìn)a被賦值為55,b,c均使用了默認(rèn)值。3參數(shù)的類型示例:默認(rèn)值參數(shù)的應(yīng)用運(yùn)行結(jié)果:第一次調(diào)用時(shí)沒有實(shí)參,使用默認(rèn)值參數(shù),形參s默認(rèn)為"Python"。第二次調(diào)用時(shí)有實(shí)參則使用位置參數(shù),形參s被賦值為"ourcountry”。3參數(shù)的類型3.3關(guān)鍵字參數(shù)關(guān)鍵字參數(shù)是指通過參數(shù)名來傳遞參數(shù)值,而不是通過順序來傳遞參數(shù)值。關(guān)鍵字參數(shù)的優(yōu)點(diǎn)是可以不按照函數(shù)定義時(shí)的參數(shù)順序進(jìn)行傳值,而是通過參數(shù)名來指定傳值的參數(shù),因此可以跳過某些參數(shù)或脫離參數(shù)的順序。關(guān)鍵字參數(shù)與默認(rèn)參數(shù)區(qū)別:關(guān)鍵字參數(shù)作用于函數(shù)調(diào)用處。默認(rèn)參數(shù)作用于形參。3參數(shù)的類型示例:關(guān)鍵字參數(shù)greeting()函數(shù)有兩個(gè)參數(shù),name和age,函數(shù)調(diào)用時(shí),給age傳參數(shù)值為25,給name傳參數(shù)值為“Amy”。當(dāng)使用關(guān)鍵字參數(shù)調(diào)用函數(shù)時(shí),可以通過參數(shù)名來指定傳入的參數(shù)值的順序。3參數(shù)的類型3.4可變長(zhǎng)度參數(shù)在程序設(shè)計(jì)中,可能會(huì)遇到函數(shù)的參數(shù)個(gè)數(shù)不固定的情況,這是就需要用到可變長(zhǎng)度的參數(shù)來實(shí)現(xiàn)預(yù)定功能。Python提供了兩種類型的可變長(zhǎng)參數(shù):*args和**kwargs。*args用于傳遞不確定數(shù)量的非關(guān)鍵字參數(shù),它將參數(shù)打包成一個(gè)元組(tuple)的形式,在函數(shù)體內(nèi)可以使用這個(gè)元組進(jìn)行迭代或操作。**kwargs用于傳遞不確定數(shù)量的關(guān)鍵字參數(shù),它將參數(shù)打包成一個(gè)字典(dict)的形式,在函數(shù)體內(nèi)可以使用這個(gè)字典進(jìn)行訪問或操作。3參數(shù)的類型示例:元組作為唯一參數(shù)示例:元組不作為唯一參數(shù)元組可變長(zhǎng)度參數(shù),需要在參數(shù)名前加*,可接收多個(gè)實(shí)參并將其放入一個(gè)元組中。3參數(shù)的類型示例:元組作為可變長(zhǎng)度參數(shù)的應(yīng)用計(jì)算一組數(shù)的平均數(shù)。輸入一組不定長(zhǎng)的數(shù)字,求出它們的平均值并返回。3參數(shù)的類型示例:字典作為可變長(zhǎng)度參數(shù)字典可變長(zhǎng)度參數(shù),需要在參數(shù)名前加**,可以接收多個(gè)實(shí)參。3參數(shù)的類型示例:購(gòu)物車計(jì)算購(gòu)物清單中所有物品的總價(jià)格。購(gòu)物清單是一個(gè)字典,其中鍵是物品的名稱,值是物品的價(jià)格。購(gòu)物清單的長(zhǎng)度和內(nèi)容是不固定的。3參數(shù)的類型示例:print函數(shù)的可變長(zhǎng)參數(shù)內(nèi)置函數(shù)print也可以看做是可變長(zhǎng)參數(shù)函數(shù)。3參數(shù)的類型示例:幾種參數(shù)類型的綜合應(yīng)用,求參數(shù)的和運(yùn)行結(jié)果:524lambda函數(shù)匿名函數(shù)又稱lambda函數(shù)。匿名函數(shù)并非沒有名字,而是將函數(shù)名作為函數(shù)結(jié)果返回。
語法格式:等價(jià)于:4lambda函數(shù)Python匿名函數(shù)的特性如下:1)lambda函數(shù)可以接受任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。這個(gè)表達(dá)式的結(jié)果就是這個(gè)函數(shù)的返回值。2)lambda函數(shù)不需要通過def定義,無需提供函數(shù)名。這也是其“匿名函數(shù)”的本質(zhì)所在。3)lambda函數(shù)可以很方便地定義在需要使用的地方,無需提前定義。4lambda函數(shù)示例:使用lambda函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)求和示例:使用lambda函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)求和4lambda函數(shù)示例:使用lambda函數(shù)實(shí)現(xiàn)列表排序其中,stulist為學(xué)生成績(jī)列表,每個(gè)元素均為一個(gè)元組,元組中的元素依次為姓名,語文成績(jī),數(shù)學(xué)成績(jī),英語成績(jī)。若需根據(jù)語文成績(jī)降序進(jìn)行排列,則可執(zhí)行語句:##結(jié)果為張峰',96,86,90),李碩',90,70,100),王涵',89,90,若需根據(jù)英語成績(jī)升序進(jìn)行排列,則可執(zhí)行語句:##結(jié)果為[('張峰',96,86,90),('李碩',90,70,100),('王涵',89,90,98)]4lambda函數(shù)若需根據(jù)總成績(jī)降序進(jìn)行排列,則可執(zhí)行語句:##結(jié)果為王涵',89,90,98),張峰',96,86,90),李碩',90,70,也可以用:5變量的作用域Python變量的作用域是由變量被定義的位置決定的。變量根據(jù)其作用范圍可以分為局部變量和全局變量。1.局部變量函數(shù)內(nèi)部定義的變量稱為內(nèi)部變量,也稱為局部變量,只能在函數(shù)內(nèi)部訪問。當(dāng)函數(shù)執(zhí)行結(jié)束后,局部變量的作用域也就結(jié)束了,變量的生命周期也隨之結(jié)束。示例:局部變量5變量的作用域2.全局變量全局變量是在函數(shù)外部定義的變量,在整個(gè)程序中都可以訪問。全局變量在任何地方都可以引用。示例:全局變量5變量的作用域3.global關(guān)鍵字在函數(shù)中只能訪問函數(shù)內(nèi)部定義的變量(局部變量),無法直接修改外部的全局變量。但是,使用global關(guān)鍵字可以在函數(shù)內(nèi)部修改全局變量的值。示例:global的應(yīng)用在以上程序中,定義了一個(gè)全局變量x,并賦值10,因此在函數(shù)體中也可以訪問此變量,但在函數(shù)內(nèi)部沒有使用global關(guān)鍵字就想修改全局變量的值x+=n,發(fā)生異常。5變量的作用域在函數(shù)體內(nèi)修改全局變量的值可以使用global關(guān)鍵字對(duì)該變量進(jìn)行聲明,然后再修改其值。5變量的作用域4.同名變量當(dāng)局部變量和全局變量的變量名一樣時(shí),以作用域小的(即局部變量)為優(yōu)先。示例:同名變量6遞歸函數(shù)內(nèi)部可以調(diào)用其他函數(shù),以實(shí)現(xiàn)較為復(fù)雜的功能。如果在一個(gè)函數(shù)中,直接或間接的調(diào)用函數(shù)自身,這個(gè)函數(shù)就稱為遞歸函數(shù)。遞歸函數(shù)是一種非常實(shí)用的程序設(shè)計(jì)技術(shù)。許多問題都具有遞歸的特性,在某些情況下,使用其他方法很難解決的問題,利用遞歸可以很輕松解決。1.遞歸定義6遞歸示例:求數(shù)的階乘階乘是指一個(gè)數(shù)連乘自己和自己的前面所有整數(shù)的積,通過可將階乘的求解分解為n(n-1)!,當(dāng)n=1,直接定義階乘的結(jié)果為1,具體見公式5-1所示。如果要計(jì)算4的階乘,根據(jù)階乘的定義,4!=4×3!,3!=3×2!,2!=2×1!,1!=1,因此,可求得4!=4×3×2×16遞歸示例:求數(shù)的階乘在該例中,定義一個(gè)Fact()函數(shù)來求解正整數(shù)的階乘。當(dāng)“n=1”時(shí),函數(shù)直接返回值“1”,當(dāng)“n>1”時(shí),調(diào)用n*Fact(n-1)。6遞歸下面將以求解正整數(shù)4的階乘來說明函數(shù)的遞歸調(diào)用過程。2.遞歸調(diào)用過程遞推過程是遞歸算法中的關(guān)鍵步驟,它將原始問題分解為一個(gè)或多個(gè)相似但規(guī)模較小的子問題。在遞推過程中,通常會(huì)調(diào)用相同的函數(shù),使用不同的參數(shù),參數(shù)被修改以處理規(guī)模較小的子問題,以便在每次遞歸調(diào)用中接近問題的解決。如圖5所示,1—4是遞推過程,將求解Fact(4)問題分解為求多個(gè)功能相似但規(guī)模較小的子問題。圖5
Fact函數(shù)遞歸調(diào)用過程6遞歸2.遞歸調(diào)用過程回歸過程是遞歸算法的基本情況或終止條件,它指定了在某些條件下遞歸應(yīng)該停止。當(dāng)問題被分解到足夠小的規(guī)模時(shí),回歸過程會(huì)提供問題的直接解決方案,而不需要進(jìn)一步的遞歸?;貧w過程的目的是防止遞歸無限進(jìn)行。如圖5所示,在遞推過程中,將求解的問題劃分到最小規(guī)模Fact(1)=1,步驟5—8直接返回每個(gè)子問題的結(jié)果。圖5
Fact函數(shù)遞歸調(diào)用過程6遞歸根據(jù)上述的遞歸調(diào)用過程可以得出,所有的遞歸函數(shù)必須滿足下列兩點(diǎn):(1)遞歸出口,遞歸必須有終止條件和終止值,在求解階乘的例子中,“n==1”是遞歸的終止條件,“1”是終止值。(2)遞歸方向,向終止條件的方向發(fā)展。在求解階乘的例子中,“Fact(n-1)”,規(guī)定了遞歸方向,不管n是多大,最終都會(huì)遞減到1。6遞歸3.遞歸的實(shí)現(xiàn)遞歸一般由函數(shù)+分支語句組成,遞歸本身是一個(gè)函數(shù),所以需要用函數(shù)定義方式去描述;在函數(shù)內(nèi)部,采用分支語句對(duì)輸入?yún)?shù)進(jìn)行判斷,根據(jù)遞歸出口和方向,分別編寫對(duì)應(yīng)代碼。6遞歸猴子一天采摘若干個(gè)桃子,現(xiàn)在每天吃現(xiàn)有桃子數(shù)的一半多一個(gè),第7天早上只剩下1個(gè)桃子,問猴子一共采摘了多少個(gè)桃子。分析:設(shè)第n天桃子數(shù)量=(第n+1天桃子數(shù)量+1)×2,而第7天桃子數(shù)量為1,可用公式5-2表示。遞歸出口:第7天桃子數(shù)量為1。遞歸方向:桃子數(shù)量從第1天到第7天遞減。6遞歸3.Fibonacci數(shù)列在自然界中的許多地方都會(huì)出現(xiàn)Fibonacci數(shù)列(斐波那契數(shù)列),例如,蜂巢中蜂的繁殖模式,花朵的花瓣數(shù),貝殼的螺旋線等。此外,斐波那契數(shù)列在計(jì)算機(jī)編程和金融市場(chǎng)預(yù)測(cè)等領(lǐng)域也有應(yīng)用。Fibonacci數(shù)列的數(shù)學(xué)表示方式如公式5-3所示。前幾項(xiàng)是:1、1、2、3、5、8、13、21等。從第三項(xiàng)開始,每一項(xiàng)都等于它前面的兩項(xiàng)之和。6遞歸3.1多變量迭代實(shí)現(xiàn)在多變量迭代方法中,可以采用三個(gè)變量f0、f1、f2完成。第一次迭代:給f0和f1賦值為1,由于每個(gè)元素是前兩個(gè)元素的和,推出第三個(gè)元素值為:f2=f1+f0。第二次迭代:將f1(1)的值傳遞給f0,f2(1)的值傳遞給f1,再通過f2=f1+f0獲取第四個(gè)元素的值。第三次迭代:將f1(2)的值傳遞給f0,f2(2)的值傳遞給f1,再通過f2=f1+f0獲取第五個(gè)元素的值。其過程如圖6所示:圖6Fibonacci數(shù)列多變量迭代過程(前5項(xiàng))6遞歸多變量迭代實(shí)現(xiàn)代碼:多變量迭代版本的優(yōu)點(diǎn)是代碼簡(jiǎn)單、執(zhí)行速度快,因?yàn)樗蛔隽撕?jiǎn)單的加法運(yùn)算,沒有涉及到復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。代碼簡(jiǎn)化:這里,巧妙地使用Python中元組功能,直接將原來的f1值作為新的f0,原來的f0+f1作為新的f1,省略了f2變量的使用6遞歸代碼實(shí)現(xiàn):列表可以有序地存放多個(gè)元素。首先定義一個(gè)列表存放第一個(gè)和第二個(gè)值“[1,1]”,從第三個(gè)值開始,每增加一個(gè)元素都是前兩個(gè)元素的和。列表迭代版本的優(yōu)點(diǎn)是邏輯清晰,容易理解,但是空間復(fù)雜度較高,每次迭代都會(huì)在列表末尾添加一個(gè)新元素,當(dāng)n很大時(shí),會(huì)消耗很多內(nèi)存。3.2列表元素迭代6遞歸遞歸出口:n=0,1。遞歸方向:由待求解的第n項(xiàng)向第二項(xiàng)遞減。3.3遞歸實(shí)現(xiàn)代碼實(shí)現(xiàn):6遞歸在采用遞歸思想解決實(shí)際問題時(shí),代碼編寫非常簡(jiǎn)單,但效率不一定高,在遞歸過程中,存在著大量的重復(fù)計(jì)算。如圖7所示,計(jì)算Fib(4)時(shí),會(huì)計(jì)算Fib(3)和Fib(2),計(jì)算Fib(3)時(shí),會(huì)計(jì)算Fib(2)和Fib(1),其中計(jì)算Fib(2)被計(jì)算了兩次,如果計(jì)算的n值非常大,將會(huì)產(chǎn)生大量的重復(fù)計(jì)算,導(dǎo)致大量的內(nèi)存開銷。3.3遞歸實(shí)現(xiàn)圖7Fibonacci數(shù)列遞歸實(shí)現(xiàn)過程綜合以上分析,F(xiàn)ibonacci數(shù)列的實(shí)現(xiàn)使用多變量迭代和列表元素迭代兩種方案效率都很好,使用遞歸的方法實(shí)現(xiàn)對(duì)系統(tǒng)的時(shí)間和空間都有過大的消耗,并不適合使用。7綜合示例去重指去除列表中的重復(fù)數(shù)據(jù),每個(gè)元素只保留一次。可以使用不同的方法來解決這個(gè)問題。1.去
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車分期付款合同2篇
- 銷售量分成合同范例3篇
- 二零二五年度墻體圖文廣告創(chuàng)意制作與維護(hù)合同3篇
- 2025年塑料粒子行業(yè)綠色供應(yīng)鏈采購(gòu)合同3篇
- 2024年水泥買賣合同(含合同變更和補(bǔ)充條款)
- 2024年度綠色建筑設(shè)計(jì)與施工合作協(xié)議書3篇
- 學(xué)困生轉(zhuǎn)化工作計(jì)劃
- 小學(xué)校本教研活動(dòng)計(jì)劃
- 電話銷售業(yè)務(wù)員工作計(jì)劃
- 勞動(dòng)合同樣板
- 2024-2030年中國(guó)硅肥行業(yè)規(guī)模分析及投資前景研究報(bào)告
- 電網(wǎng)行業(yè)工作匯報(bào)模板22
- 2024年度跨境電商平臺(tái)承包經(jīng)營(yíng)合同3篇
- 2025年上半年人民日?qǐng)?bào)社招聘應(yīng)屆高校畢業(yè)生85人筆試重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解
- 山東省臨沂市2023-2024學(xué)年高二上學(xué)期期末考試生物試題 含答案
- 2024-2025學(xué)年一年級(jí)數(shù)學(xué)上冊(cè)期末樂考非紙筆測(cè)試題(二 )(蘇教版2024秋)
- 辦公樓電氣改造施工方案
- 浙江省衢州市2023-2024學(xué)年高一上學(xué)期期末英語試題(含答案)3
- 上學(xué)期高二期末語文試卷(含答案)
- 超齡員工用工免責(zé)協(xié)議書
- 《雁門太守行》課件
評(píng)論
0/150
提交評(píng)論