一、使用遞歸的背景

創新互聯建站服務項目包括花溪網站建設、花溪網站制作、花溪網頁制作以及花溪網絡營銷策劃等。多年來,我們專注于互聯網行業,利用自身積累的技術優勢、行業經驗、深度合作伙伴關系等,向廣大中小型企業、政府機構等提供互聯網行業的解決方案,花溪網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到花溪省份的部分城市,未來相信會繼續擴大服務區域并繼續獲得客戶的支持與信任!
先來看一個??接口結構:
這個孩子,他是一個列表,下面有6個元素
展開children下第一個元素[0]看看:
發現[0]除了包含一些字段信息,還包含了 children 這個字段(喜當爹),同時這個children下包含了2個元素:
展開他的第一個元素,不出所料,也含有children字段(人均有娃)
可以理解為children是個對象,他包含了一些屬性,特別的是其中有一個屬性與父級children是一模一樣的,他包含父級children所有的屬性。
比如每個children都包含了一個name字段,我們要拿到所有children里name字段的值,這時候就要用到遞歸啦~
二、find_children.py
拆分理解:
1.首先import requests庫,用它請求并獲取接口返回的數據
2.若children以上還有很多層級,可以縮小數據范圍,定位到children的上一層級
3.來看看定義的函數
我們的函數調用:find_children(node_f, 'children')
其中,node_f:json字段
??? children:遞歸對象
?以下這段是實現遞歸的核心:
?? if items['children']:
?items['children']不為None,表示該元素下的children字段還有子類數據值,此時滿足if條件,可理解為 if 1。
?items['children']為None,表示該元素下children值為None,沒有后續可遞歸值,此時不滿足if條件,可理解為 if 0,不會再執行if下的語句(不會再遞歸)。
至此,每一層級中children的name以及下一層級children的name就都取出來了
希望到這里能幫助大家理解遞歸的思路,以后根據這個模板直接套用就行
(晚安啦~)
源碼參考:
函數的遞歸調用
遞歸問題是一個說簡單也簡單,說難也有點難理解的問題.我想非常有必要對其做一個總結.
首先理解一下遞歸的定義,遞歸就是直接或間接的調用自身.而至于什么時候要用到遞歸,遞歸和非遞歸又有那些區別?又是一個不太容易掌握的問題,更難的是對于遞歸調用的理解.下面我們就從程序+圖形的角度對遞歸做一個全面的闡述.
我們從常見到的遞歸問題開始:
1 階層函數
#include iostream
using namespace std;
int factorial(int n)
{
if (n == 0)
{
return 1;
}
else
{
int result = factorial(n-1);
return n * result;
}
}
int main()
{
int x = factorial(3);
cout x endl;
return 0;
}
這是一個遞歸求階層函數的實現。很多朋友只是知道該這么實現的,也清楚它是通過不斷的遞歸調用求出的結果.但他們有些不清楚中間發生了些什么.下面我們用圖對此做一個清楚的流程:
根據上面這個圖,大家可以很清楚的看出來這個函數的執行流程。我們的階層函數factorial被調用了4次.并且我們可以看出在調用后面的調用中,前面的調用并不退出。他們同時存在內存中。可見這是一件很浪費資源的事情。我們該次的參數是3.如果我們傳遞10000呢。那結果就可想而知了.肯定是溢出了.就用int型來接收結果別說10000,100就會產生溢出.即使不溢出我想那肯定也是見很浪費資源的事情.我們可以做一個粗略的估計:每次函數調用就單變量所需的內存為:兩個int型變量.n和result.在32位機器上占8B.那么10000就需要10001次函數調用.共需10001*8/1024 = 78KB.這只是變量所需的內存空間.其它的函數調用時函數入口地址等仍也需要占用內存空間??梢娺f歸調用產生了一個不小的開銷.
2 斐波那契數列
int Fib(int n)
{
if (n = 1)
{
return n;
}
else
{
return Fib(n-1) + Fib(n-2);
}
}
這個函數遞歸與上面的那個有些不同.每次調用函數都會引起另外兩次的調用.最后將結果逐級返回.
我們可以看出這個遞歸函數同樣在調用后買的函數時,前面的不退出而是在等待后面的結果,最后求出總結果。這就是遞歸.
3
#include iostream
using namespace std;
void recursiveFunction1(int num)
{
if (num 5)
{
cout num endl;
recursiveFunction1(num+1);
}
}
void recursiveFunction2(int num)
{
if (num 5)
{
recursiveFunction2(num+1);
cout num endl;
}
}
int main()
{
recursiveFunction1(0);
recursiveFunction2(0);
return 0;
}
運行結果:
1
2
3
4
4
3
2
1
該程序中有兩個遞歸函數。傳遞同樣的參數,但他們的輸出結果剛好相反。理解這兩個函數的調用過程可以很好的幫助我們理解遞歸:
我想能夠把上面三個函數的遞歸調用過程理解了,你已經把遞歸調用理解的差不多了.并且從上面的遞歸調用中我們可以總結出遞歸的一個規律:他是逐級的調用,而在函數結束的時候是從最后面往前反序的結束.這種方式是很占用資源,也很費時的。但是有的時候使用遞歸寫出來的程序很容易理解,很易讀.
為什么使用遞歸:
1 有時候使用遞歸寫出來的程序很容易理解,很易讀.
2 有些問題只有遞歸能夠解決.非遞歸的方法無法實現.如:漢諾塔.
遞歸的條件:
并不是說所有的問題都可以使用遞歸解決,他必須的滿足一定的條件。即有一個出口點.也就是說當滿足一定條件時,程序可以結束,從而完成遞歸調用,否則就陷入了無限的遞歸調用之中了.并且這個條件還要是可達到的.
遞歸有哪些優點:
易讀,容易理解,代碼一般比較短.
遞歸有哪些缺點:
占用內存資源多,費時,效率低下.
因此在我們寫程序的時候不要輕易的使用遞歸,雖然他有他的優點,但是我們要在易讀性和空間,效率上多做權衡.一般情況下我們還是使用非遞歸的方法解決問題.若一個算法非遞歸解法非常難于理解。我們使用遞歸也未嘗不可.如:二叉樹的遍歷算法.非遞歸的算法很難與理解.而相比遞歸算法就容易理解很多.
對于遞歸調用的問題,我們在前一段時間寫圖形學程序時,其中有一個四連同填充算法就是使用遞歸的方法。結果當要填充的圖形稍微大一些時,程序就自動關閉了.這不是一個人的問題,所有人寫出來的都是這個問題.當時我們給與的解釋就是堆棧溢出。就多次遞歸調用占用太多的內存資源致使堆棧溢出,程序沒有內存資源執行下去,從而被操作系統強制關閉了.這是一個真真切切的例子。所以我們在使用遞歸的時候需要權衡再三.
python用遞歸函數求1+2+3+4+5的值的方法:
1、寫出臨界條件
2、找這一次和上一次的關系
3、假設當前函數已經能用,調用自身計算上一次的結果,再求出本次的結果
代碼實現如下:
網站標題:python遞歸函數教學 Python 遞歸函數
分享網址:http://www.yijiale78.com/article14/hhiige.html
成都網站建設公司_創新互聯,為您提供網站維護、面包屑導航、Google、網站策劃、電子商務、外貿網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯