<b>簡單的來定義下這個(gè)遞歸函數(shù)渊涝,通俗點(diǎn)講就是一個(gè)函數(shù)在內(nèi)部調(diào)用自身慎璧,這個(gè)函數(shù)就是遞歸函數(shù)。
bb is cheap , show me the code .
個(gè)人學(xué)習(xí)理論跨释,先定義在code在bb
來用一段代碼以及剖析運(yùn)行過程胸私,來理解python遞歸函數(shù)。
比如我們要實(shí)現(xiàn)一個(gè)計(jì)算的函數(shù)鳖谈,就比如說岁疼,定義參數(shù)為10,那么這個(gè)函數(shù)就要負(fù)責(zé)計(jì)算
10 * 9 * 8 ………… * 3 * 2 * 1 的結(jié)果缆娃。
先用常規(guī)方法:
#!/usr/bin/env python
#auther:Lewis
sum1 =1
for i in range(1,101):
sum1 = i*sum1
print(sum1)
簡述常規(guī)方法運(yùn)行過程:
sum = 1
進(jìn)入for 循環(huán)捷绒,迭代1----100的之間的數(shù)
for i in range:
i = 1
i = 2
i = 3
i = 4
i = 5
...
i = 100
每一個(gè)臨時(shí)變量i都是一個(gè)新的值。
sum1 = sum1 * i 這樣寫是為了清楚運(yùn)算邏輯贯要,更簡便的寫法是
sum1 *= i
每一次sum1 * i 的結(jié)果都會(huì)存到全局變量sum1里面
(根據(jù)for循環(huán)暖侨,全局變量的值 是不斷變化的)
循環(huán)結(jié)束,按順序打印sum1的值
使用遞歸函數(shù)方法:
def sum_lewis(n):
if n <=0:
return 'sorry,must be >=1'
if n == 1:
return 1
return n * sum_lewis(n-1)
print(sum_lewis(100))
簡述遞歸函數(shù)方法運(yùn)行過程
先定義一個(gè)名為sum_lewis的函數(shù)崇渗,并指定一個(gè)n的形參
例行判斷如果參數(shù)為0就返回提示字逗,如果參數(shù)為1就返回1
經(jīng)過雙層判斷之后(增加程序容錯(cuò)率),在返回一個(gè)計(jì)算方式。 n * sum_lewis(n-1) 在返回值中再次調(diào)用該函數(shù)本身宅广,這種行為就可以把他稱作遞歸函數(shù)葫掉。
===> sum_lewis(5)
===> 5 * sum_lewis(4)
===> 5 * (4 * sum_lewis(3))
===> 5 * (4 * (3 * sum_lewis(2)))
===> 5 * (4 * (3 * (2 * sum_lewis(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
以上為如果參數(shù)為5的,運(yùn)行推斷過程乘碑。
小結(jié)
<b>使用遞歸函數(shù)的優(yōu)點(diǎn)是邏輯簡單清晰挖息,缺點(diǎn)是過深的調(diào)用會(huì)導(dǎo)致棧溢出金拒。
針對(duì)尾遞歸優(yōu)化的語言可以通過尾遞歸防止棧溢出兽肤。尾遞歸事實(shí)上和循環(huán)是等價(jià)的套腹,沒有循環(huán)語句的編程語言只能通過尾遞歸實(shí)現(xiàn)循環(huán)。
Python標(biāo)準(zhǔn)的解釋器沒有針對(duì)尾遞歸做優(yōu)化资铡,任何遞歸函數(shù)都存在棧溢出的問題电禀。
作者郵箱:devopslewis@outlook.com
微信:Stephen_403 文章有任何問題、錯(cuò)誤笤休、版權(quán)可以聯(lián)系作者及時(shí)更正