遞歸函數不是帝龜啊!:一個函數調用了它自己本身就叫做遞歸
定義一個比較糟糕的函數調用自身:
你會發現它調用test()的時候,它唯一的函數內容是打印myoffer然后returntest(),再回到定義函數,打印myoffer,然后return test()一直循環往復;
這就有疑問了
是不是會一直執行下去呢,理論上它會一直執行下去直到消耗掉所有內存,其實Python3設置了遞歸默認深度是100層,到達之后就會報錯。不過在寫爬蟲工具的時候就可能不止100層了,所以我們就要自力更生了。
這樣深層次的調用就會導致“棧溢出”就好比一個杯子它有自己的最大容量,超過了這個容量就會溢出。
來個人道點的例子解釋帝龜和棧溢出:求1-100的階乘。
先分析:
想要得到的結果1×2×3×…×100
可以拆分成100×函數(99)【函數(99)可以完成1×2×3×…×99 】
可以拆分成 99×函數(98)【函數(99)可以完成1×2×3×…×98】
……
……
…….
可以拆分成2×函數(1)【函數(1)可以完成1×2】正確的解法如下
現在來了解一下這只龜,先拿一個print(test(3))來剖析
第一次程序執行時會先傳入3,替換所有numbers,當執行到test(3-1)又要調用test()然后就會傳入2,變為test(numbers=2)下面的程序。
同理執行到test(2-1)又要再次調用test(),變為test(numbers=1)下面的程序
直接執行else后的程序返回1
注意:一個函數調用return有兩種含義:返回一個值或結束當前函數;
所以說當return 1時第二個程序中的test(2-1)就會替換為return 2×1
接著就會執行這個return 2×1時,第一個程序中的test(3-1)就會替換為return 3×2×1
當執行這個return 3×2×1時,程序就會執行結果print(test(3)),同理要執行print(test(100))也是一樣的原理,這就是帝龜。
好啦現在理解了帝龜就可以更透徹明白棧溢出了
第一步當程序執行print(test(3))這玩意的時候,就要調用函數test(number=3),然后執行下面這個函數
執行好后呢,先把這個3放到杯子底下,然后執行numbers=2,就把2再放到杯子里,一層層上疊(就是在內存中存儲好,為了當返回執行return2×1時,能夠識別3×test(3-1)并替換為return 3×2×1,其它的類似,當返回執行return1時,能夠識別2×test(2-1)并替換為return 2×1)
所以說每次調用自己函數的時候呢就要在杯子中裝點東西,當你調用循環的次數是1000000或者更大,杯子總有滿的時候,等到裝不下的時候就叫做“棧溢出”了。
至于為甚么叫“棧(stack)溢出”怎么上檔次的名字呢
上面說了存東西的時候都是從杯底往上一層層的疊加(調用一次函數,棧就會加一層棧幀),到你要取的時候只能先從上面拿了(函數返回棧就會減一層棧幀),杯子是有最大容量的(棧的大小不是無限的,遞歸調用過多就會棧溢出)總結:這種存儲特性“先進后出”
注意:為什么上面的例子numbers=1要多帶帶處理呢,因為當numbers傳入1時,就會變成test(1-1),沒有到0的階乘,這樣結果就會變成0.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41545.html
摘要:再調用個絕對值內置函數來加深影響心急吃不了熱豆腐啊有且僅能傳入一個參數,傳入不符合數量的參數就會報錯誤傳入的參數數量是沒錯了,但傳入錯誤的參數類型也是會死的很慘的。 調用函數 干貨:Python官網查看函數幫助信息 http://docs.python.org/3/libr... showImg(https://segmentfault.com/img/bV71Kn?w=348&h=8...
摘要:理解了輸入輸出,就可以簡單的打印有意義的程序了比如打印先輸入回車輸入或其它內容,存入變量輸入當然為了用戶體驗更好,可以適當的添加一些提示信息數據類型和變量整數常用十六進制表示與數學上表示方法一樣等。常量不能變的量,通常用大寫字母表示 1、輸出函數:Print() 接受多個字符串時用逗號隔開(相當于空格),就可連成一串輸出。 showImg(https://segmentfault.co...
摘要:本文是通過廖雪峰的網站學習而整理的真的是很好的教程,省得我花錢買書了,然后我沒有去再整理總結語法,而是直接通過寫出代碼段來體現自己的學習,也方便以后的快速復習回顧。 不想再像以前那樣,什么都從頭開始學習語法、總結語法,這樣反而會過分糾結于語法,耽誤了開發,畢竟語言的主要屬性是工具,次要的屬性是語言本身。 所以還是先熟練使用語言去進行開發,等足夠熟悉了,再去研究語言本身(編譯原理……)。...
摘要:同樣的用上節講的函數獲取元素的個數記住這是獲取的是列表個數個數個數重要的事說三遍。用索引訪問每個元素的位置,索引是從開始的開始的開始的索引也是有容忍限度的超過了就會原地爆炸報錯如果列表中元素個數賊多,想獲取后面的元素就要實行曲線救國了。 list和tuple是Python內置的有序集合,一個是可變的,一個是不可變滴;這都不是事,主要是理解一下指向不變。 看圖說話: showImg(ht...
閱讀 1039·2021-11-18 13:23
閱讀 746·2021-11-08 13:16
閱讀 855·2021-10-11 10:58
閱讀 3510·2021-09-22 15:26
閱讀 1732·2021-09-08 10:42
閱讀 1807·2021-09-04 16:45
閱讀 1733·2019-08-30 15:54
閱讀 2564·2019-08-30 13:45