Python遞歸算法入門


遞歸是一種算法,它在編程里面有着廣泛的應用:

1. 遞歸必須滿足哪兩個基本條件?
一、函數調用自身
二、設置了正確的返回條件
2. 思考一下,按照遞歸的特性,在編程中有沒有不得不使用遞歸的情況?
答:例如漢諾塔,目錄索引(因為你永遠不知道這個目錄里邊是否還有目錄),快速排序(二十世紀十大算法之一),樹結構的定義等如果使用遞歸,會事半功倍,否則會導致程序無法實現或相當難以理解。
3. 用遞歸去計算階乘問題或斐波那契數列是很糟糕的算法,你知道為什么嗎?
答:普通程序員用迭代,天才程序員用遞歸”這句話是不無道理的,但是你不要理解錯了,不是說會使用遞歸,把所有能迭代的東西用遞歸來代替就是“天才程序員”了,恰好相反,如果你真的這么做的話,那你就是“烏龜程序員”啦。
為什么這么說呢?不要忘了,遞歸的實現可以是函數自個兒調用自個兒,每次函數的調用都需要進行壓棧、彈棧、保存和恢復寄存器的棧操作,所以在這上邊是非常消耗時間和空間的。另外,如果遞歸一旦忘記了返回,或者錯誤的設置了返回條件,那么執行這樣的遞歸代碼就會變成一個無底洞:只進不出!所以在寫遞歸代碼的時候,千萬要記住口訣:遞歸遞歸,歸去來兮!出來混,總有一天是要還的!
4. 遞歸的優缺點

優點:
1)遞歸的基本思想是把規模大的問題轉變成規模小的問題組合,從而簡化問題的解決難度(例如漢諾塔游戲)。
2)有些問題使用遞歸使得代碼簡潔易懂(例如你可以很容易的寫出前中后序的二叉樹遍歷的遞歸算法,但如果要寫出相應的非遞歸算法就不是初學者可以做到的了。)
缺點:
1)由於遞歸的原理是函數調用自個兒,所以一旦大量的調用函數本身空間和時間消耗是“奢侈的”(當然法拉利也奢侈,但還是很多人趨之若鶩)。
2)初學者很容易錯誤的設置了返回條件,導致遞歸代碼無休止調用,最終棧溢出,程序
崩潰。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM