欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

包含python遞歸函數(shù)知識(shí)的詞條

python函數(shù)高級(jí)

一、函數(shù)的定義

讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名與空間、虛擬空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、海淀網(wǎng)站維護(hù)、網(wǎng)站推廣。

函數(shù)是指將一組語(yǔ)句的集合通過(guò)一個(gè)名字(函數(shù)名)封裝起來(lái),想要執(zhí)行這個(gè)函數(shù),只需要調(diào)用函數(shù)名即可

特性:

減少重復(fù)代碼

使程序變得可擴(kuò)展

使程序變得易維護(hù)

二、函數(shù)的參數(shù)

2.1、形參和實(shí)參數(shù)

形參,調(diào)用時(shí)才會(huì)存在的值

實(shí)慘,實(shí)際存在的值

2.2、默認(rèn)參數(shù)

定義:當(dāng)不輸入?yún)?shù)值會(huì)有一個(gè)默認(rèn)的值,默認(rèn)參數(shù)要放到最后

2.3、 關(guān)鍵參數(shù)

定義: 正常情況下,給函數(shù)傳參數(shù)要安裝順序,不想按順序可以用關(guān)鍵參數(shù),只需要指定參數(shù)名即可,(指定了參數(shù)名的就叫關(guān)鍵參數(shù)),但是要求是關(guān)鍵參數(shù)必須放在位置參數(shù)(以位置順序確定對(duì)應(yīng)的參數(shù))之后

2.4、非固定參數(shù)

定義: 如你的函數(shù)在傳入?yún)?shù)時(shí)不確定需要傳入多少個(gè)參數(shù),就可以使用非固定參數(shù)

# 通過(guò)元組形式傳遞

# 通過(guò)列表形式傳遞

# 字典形式(通過(guò)k,value的方式傳遞)

# 通過(guò)變量的方式傳遞

三、函數(shù)的返回值

作用:

返回函數(shù)執(zhí)行結(jié)果,如果沒(méi)有設(shè)置,默認(rèn)返回None

終止函數(shù)運(yùn)行,函數(shù)遇到return終止函數(shù)

四、變量的作用域

全局變量和局部變量

在函數(shù)中定義的變量叫局部變量,在程序中一開(kāi)始定義的變量叫全局變量

全局變量作用域整個(gè)程序,局部變量作用域是定義該變量的函數(shù)

當(dāng)全局變量與局部變量同名是,在定義局部變量的函數(shù)內(nèi),局部變量起作用,其他地方全局變量起作用

同級(jí)的局部變量不能互相調(diào)用

想要函數(shù)里邊的變量設(shè)置成全局變量,可用global進(jìn)行設(shè)置

五、特殊函數(shù)

5.1、嵌套函數(shù)

定義: 嵌套函數(shù)顧名思義就是在函數(shù)里邊再嵌套一層函數(shù)

提示 在嵌套函數(shù)里邊調(diào)用變量是從里往外依次調(diào)用,意思就是如果需要調(diào)用的變量在當(dāng)前層沒(méi)有就會(huì)去外層去調(diào)用,依次內(nèi)推

匿名函數(shù)

基于Lambda定義的函數(shù)格式為: lambda 參數(shù):函數(shù)體

參數(shù),支持任意參數(shù)。

匿名函數(shù)適用于簡(jiǎn)單的業(yè)務(wù)處理,可以快速并簡(jiǎn)單的創(chuàng)建函數(shù)。

# 與三元運(yùn)算結(jié)合

5.3、高階函數(shù)

定義:變量可以指向函數(shù),函數(shù)的參數(shù)可以接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)稱(chēng)之為高階函數(shù) 只需要滿(mǎn)足一下任意一個(gè)條件,即是高階函數(shù)

接收一個(gè)或多個(gè)函數(shù)作為輸入

return返回另一個(gè)函數(shù)

5.4、遞歸函數(shù)

定義:一個(gè)函數(shù)可以調(diào)用其他函數(shù),如果一個(gè)函數(shù)調(diào)用自己本身,這個(gè)函數(shù)就稱(chēng)為遞歸函數(shù)

在默認(rèn)情況下Python最多能遞歸1000次,(這樣設(shè)計(jì)師是為了防止被內(nèi)存被撐死)可以通過(guò)sys.setrecursionlimit(1500)進(jìn)行修改

遞歸實(shí)現(xiàn)過(guò)程是先一層一層的進(jìn),然后在一層一層的出來(lái)

必須有一個(gè)明確的條件結(jié)束,要不然就是一個(gè)死循環(huán)了

每次進(jìn)入更深層次,問(wèn)題規(guī)模都應(yīng)該有所減少

遞歸執(zhí)行效率不高,遞歸層次過(guò)多會(huì)導(dǎo)致站溢出

# 計(jì)算4的階乘 4x3x2x1

# 打印數(shù)字從1-100

5.5、閉包現(xiàn)象

定義:內(nèi)層函數(shù)調(diào)用外層函數(shù)的變量,并且內(nèi)存函數(shù)被返回到外邊去了

閉包的意義:返回的函數(shù)對(duì)象,不僅僅是一個(gè)函數(shù)對(duì)象,在該函數(shù)外還包裹了一層作用域,這使得,該函數(shù)無(wú)論在何處調(diào)用,優(yōu)先使用自己外層包裹的作用域

利用遞歸函數(shù)求斐波那契值python版

首先我們要了解一下什么是遞歸。

遞歸法,遞歸法就是利用上一個(gè)或者上幾個(gè)狀態(tài)來(lái)求取當(dāng)前狀態(tài)的值(個(gè)人看法)。也可以說(shuō)成函數(shù)自己調(diào)用自己的一種解決問(wèn)題的策略。因此遞歸法通常是依托函數(shù)來(lái)實(shí)現(xiàn)的,遞歸函數(shù)總是會(huì)有一個(gè)出口,我們?cè)诮鉀Q遞歸問(wèn)題時(shí),只需要找出遞歸的關(guān)系式以及遞歸函數(shù)的出口(這兩個(gè)可以說(shuō)是遞歸函數(shù)的核心了)。下面我將在這里舉求斐波那契值的例子帶領(lǐng)著大家具體的實(shí)踐一下遞歸法。

很顯然遞歸函數(shù)的遞推式是:fib(n) = fib(n-1)+fib(n-2)。

遞歸函數(shù)的出口是當(dāng)n為1時(shí)返回1,當(dāng)n為0時(shí)返回0。

最后遞歸函數(shù)的核心代碼就可以寫(xiě)出了:

然后總的代碼就是:

具體思路如下:

語(yǔ)句 return fib(n-1)+fib(n-2)的意思就是向前求斐波那契值,直到n-1=1,n-2=0

因?yàn)橹挥械?個(gè)和第0個(gè)斐波那契值是確定的

例:

當(dāng)n=3時(shí)

第一次調(diào)用函數(shù)fib會(huì)執(zhí)行第三條語(yǔ)句(因?yàn)閚1)這樣求回返回fib(2)+fib(1)

第二次調(diào)用函數(shù)時(shí),因?yàn)?1所有會(huì)返回fib(1)+fib(0);因?yàn)?不大于1,所以調(diào)用函數(shù)時(shí)

會(huì)執(zhí)行第二條語(yǔ)句返回1值。

第三次調(diào)用函數(shù),會(huì)執(zhí)行第一和第二條語(yǔ)句,依次返回0和1從而求得fib(2)

fib(3)=fib(2)+fib(1)

fib(2)=fib(1)+fib(0)

即fib(3)=fib(1)+fib(0)+fib(1)=2*fib(1)+fib(0)

Python算法-爬樓梯與遞歸函數(shù)

可以看出來(lái)的是,該題可以用斐波那契數(shù)列解決。

樓梯一共有n層,每次只能走1層或者2層,而要走到最終的n層。不是從n-1或者就是n-2來(lái)的。

F(1) = 1

F(2) = 2

F(n) = F(n-1) + F(n-2) (n=3)

這是遞歸寫(xiě)法,但是會(huì)導(dǎo)致棧溢出。在計(jì)算機(jī)中,函數(shù)的調(diào)用是通過(guò)棧進(jìn)行實(shí)現(xiàn)的,如果遞歸調(diào)用的次數(shù)過(guò)多,就會(huì)導(dǎo)致棧溢出。

針對(duì)這種情況就要使用方法二,改成非遞歸函數(shù)。

將遞歸進(jìn)行改寫(xiě),實(shí)現(xiàn)循環(huán)就不會(huì)導(dǎo)致棧溢出

python 遞歸限制

python不能無(wú)限的遞歸調(diào)用下去。并且當(dāng)輸入的值太大,遞歸次數(shù)太多時(shí),python 都會(huì)報(bào)錯(cuò)

首先說(shuō)結(jié)論,python解釋器這么會(huì)限制遞歸次數(shù),這么做為了避免"無(wú)限"調(diào)用導(dǎo)致的堆棧溢出。

tail recursion 就是指在程序最后一步執(zhí)行遞歸。這種函數(shù)稱(chēng)為 tail recursion function。舉個(gè)例子:

這個(gè)函數(shù)就是普通的遞歸函數(shù),它在遞歸之后又進(jìn)行了 乘 的操作。 這種普通遞歸,每一次遞歸調(diào)用都會(huì)重新推入一個(gè)調(diào)用堆棧。

把上述調(diào)用改成 tail recursion function

tail recursion 的好處是每一次都計(jì)算完,將結(jié)果傳遞給下一次調(diào)用,然后本次調(diào)用任務(wù)就結(jié)束了,不會(huì)參與到下一次的遞歸調(diào)用。這種情況下,只重復(fù)用到了一個(gè)堆棧。因此可以?xún)?yōu)化結(jié)構(gòu)。就算是多次循環(huán),也不會(huì)出現(xiàn)棧溢出的情況。這就是 tail recursion optimization 。

c和c++都有這種優(yōu)化, python沒(méi)有,所以限制了調(diào)用次數(shù),就是為了防止無(wú)限遞歸造成的棧溢出。

如果遞歸次數(shù)過(guò)多,導(dǎo)致了開(kāi)頭的報(bào)錯(cuò),可以使用 sys 包手動(dòng)設(shè)置recursion的limit

手動(dòng)放大 recursionlimit 限制:

關(guān)于python遞歸函數(shù)怎樣理解

遞歸的思想主要是能夠重復(fù)某些動(dòng)作,比如簡(jiǎn)單的階乘,次方,回溯中的八皇后,數(shù)獨(dú),還有漢諾塔,分形。

由于堆棧的機(jī)制,一般的遞歸可以保留某些變量在歷史狀態(tài)中,比如你提到的return x * power..., 但是某些或許龐大的問(wèn)題或者是深度過(guò)大的問(wèn)題就需要盡量避免遞歸,因?yàn)榭赡軙?huì)棧溢出。還有一個(gè)問(wèn)題是~python不支持尾遞歸優(yōu)化!!!!所以~還是盡量避免遞歸的出現(xiàn)。

def power(x, n)

if n 0:

return 1

return x * power(x, n - 1)

power(3, 3)

3 * power(3, 2)

3 * (3 * power(3, 1))

3 * (3 * (3 * power(3, 0)))

3 * (3 * (3 * 1)) 這里n = 0, return 1

3 * (3 * 3)

3 * 9

27

當(dāng)函數(shù)形參n=0的時(shí)候,開(kāi)始回退~直到第一次調(diào)用power結(jié)束。

名稱(chēng)欄目:包含python遞歸函數(shù)知識(shí)的詞條
本文地址:http://chinadenli.net/article0/hpjoio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航網(wǎng)站營(yíng)銷(xiāo)App設(shè)計(jì)關(guān)鍵詞優(yōu)化網(wǎng)站內(nèi)鏈響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司