遞迴的效能分析與經典運用
1.遞迴慢的原因?
大家都知道遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做地址儲存,引數傳遞等,這是通過一個遞迴工作棧實現的。具體是每次呼叫函式本身要儲存的內容包括:區域性變數、形參、呼叫函式地址、返回值。那麼,如果遞迴呼叫N次,就要分配N*區域性變數、N*形參、N*呼叫函式地址、N*返回值。這勢必是影響效率的。
2.用迴圈與遞迴之間演算法區別?
遞迴與迴圈是兩種不同的解決問題的典型思路。當然也並不是說迴圈效率就一定比遞迴高,遞迴和迴圈是兩碼事,遞迴帶有棧操作,迴圈則不一定,兩個概念不是一個層次,不同場景做不同的嘗試。
2.1遞迴演算法:
優點:程式碼簡潔、清晰,並且容易驗證正確性。(如果你真的理解了演算法的話,否則你更暈)
缺點:它的執行需要較多次數的函式呼叫,如果呼叫層數比較深,需要增加額外的堆疊處理(還有可能出現堆疊溢位的情況),比如引數傳遞需要壓棧等操作,會對執行效率有一定影響。但是,對於某些問題,如果不使用遞迴,那將是極端難看的程式碼。
2.2迴圈演算法:
優點:速度快,結構簡單。
缺點:並不能解決所有的問題。有的問題適合使用遞迴而不是迴圈。如果使用迴圈並不困難的話,最好使用迴圈。
2.3遞迴演算法和迴圈演算法總結:
1. 一般遞迴呼叫可以處理的演算法,也通過迴圈去解決常需要額外的低效處理。
2. 現在的編譯器在優化後,對於多次呼叫的函式處理會有非常好的效率優化,效率未必低於迴圈。
3.遞迴和迴圈兩者完全可以互換。如果用到遞迴的地方可以很方便使用迴圈替換,而不影響程式的閱讀,那麼替換成遞迴往往是好的。(例如:求階乘的遞迴實現與迴圈實現。)
3.遞迴使用的棧是什麼樣的一個棧呢?
首先,看一下系統棧和使用者棧的用途。
3.1系統棧(也叫核心棧、核心棧)是記憶體中屬於作業系統空間的一塊區域,其主要用途為: (1)儲存中斷現場,對於巢狀中斷,被中斷程式的現場資訊依次壓入系統棧,中斷返回時逆序彈出; (2)儲存作業系統子程式間相互呼叫的引數、返回值、返回點以及子程式(函式)的區域性變數。
3.2使用者棧是使用者程序空間中的一塊區域,用於儲存使用者程序的子程式間相互呼叫的引數、返回值、返回點以及子程式(函式)的區域性變數。
我們編寫的遞迴程式屬於使用者程式,因此使用的是使用者棧。
4.遞迴的運用例項?
斐波那契數列 ,漢諾塔問題,階乘,貨郎擔問題!相關推薦
遞迴的效能分析與經典運用
1.遞迴慢的原因? 大家都知道遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做地址儲存,引數傳遞等,這是通過一個遞迴工作棧實現的。具體是每次呼叫函式本身要儲存的內容包括:區域性變數、形參、呼叫函式地址、返回值。那麼,如果遞迴呼叫N次,就要分配N*區域性變數、N*
簡單遞迴題目分析與解答
1.放蘋果:把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法(用K表示)?注意:5,1,1和1,5,1 是同一種分法。 輸入: 第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=M,N
漢諾塔非遞迴演算法分析與實現
漢諾塔的遞迴演算法很容易理解,也非常容易實現。下面,本文討論了漢諾塔問題的非遞迴演算法,核心內容就是棧的使用技巧。 首先,對於每個柱子來說,就是一個棧,這個棧有個特點就是,大數放在下面,小數放在上面。在首次建立棧時,我們可以先儲存好這些資料,假設最小的盤子序號
第五次作業——python效能分析與幾個問題(個人作業)
結合 撰寫 porting tin 設計實現 cti personal 設計文檔 hub 第五次作業——效能分析與幾個問題(個人作業) 前言 閱讀了大家對於本課程的目標和規劃之後,想必很多同學都躍躍欲試,迫不及待想要提高自身實踐能力,那麽就從第一個個人項目開始吧,題目要求見
OpenCV學習筆記(30)KAZE 演算法原理與原始碼分析(四)KAZE特徵的效能分析與比較
KAZE系列筆記: 1. OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2. OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構
python和c遞迴效能的對比
效能上c真的快了很多 # 好比算這個漢諾塔遊戲 # 假設有三根柱子,a,b,c, # a柱子上有n個餅,上面的餅比下面的餅小, # 現在要將餅全部原狀挪到另外一個柱子上,要求不能把大餅放在小餅上,請問要挪動多少次。 #include<iostream> using namespace s
效能分析與提升
圖形化工具進行效能分析 此篇部落格主要談談用圖形化工具分析與優化python程式碼,雖然我們的工程不是很大,但符合比較大吧,功能有字母頻率統計、詞頻統計、支援stopword、動詞時態歸一化、動介短語頻率統計。我以 step0-輸出某個英文文字檔案中 26 字母出現的頻率,由高到低
效能分析與程式碼覆蓋率測試
效能分析 對程式碼優化的前提是需要了解效能瓶頸在什麼地方,程式執行的主要時間是消耗在哪裡,對於比較複雜的程式碼可以藉助一些工具來定位,python 內建了豐富的效能分析工具,如 profile,cProfile 與 hotshot 等。其中 Profiler 是 python 自帶的一組程式,能
遞迴呼叫分析-最大自序列求和問題
昨天開始看《資料結構與演算法分析-java語言描述》這本書,在第二章舉例了一個演算法問題“最大子序列和問題”,在第三種遞迴方法,由於開始並沒有很好理解,遞迴呼叫在演算法中有很重要,用了最簡單一個例子來加深理解!(當然這種方法在這四種演算法中不是最優的)。 先給出原始碼: package
資料結構 筆記:遞迴的思想與應用
遞迴是一種數學上分而自治的思想 -將原問題分解為規模較小的問題進行處理 ·分解後的問題與原問題的型別完全相同,單規模較小 ·通過小規模問題的解,能夠輕易求得原問題的解 -問題的分解是有限的(遞迴不能無限進行) ·當邊界條件不滿足時,分解問題(遞迴繼續進行) ·當邊界條件不滿足
漫談遞迴:迴圈與迭代
漫談遞迴:迴圈與迭代 理清遞迴、迭代、迴圈的概念 感謝 參考或原文 先摘抄“為之漫筆”對這幾個概念的一段理解: loop、iterate、traversal和recursion這幾個詞是計算機技術書中經常會出現的幾個詞彙。眾
Java的遞迴、如何與流相結合
遞迴技術 需求:掃描D:\test所有子資料夾及子子資料夾下的.jpg檔案。 我們如果用迴圈來做這件事,我們不知道迴圈的結束條件,也不知道到底有多少層,所以比較麻煩。 我們可以用一種新的思想:遞迴。 遞迴舉例: 從前有一座山,山裡有座廟,廟裡有個老和尚,老和尚在給小和尚講故
資料結構開發(15):遞迴的思想與應用
0.目錄 1.遞迴的思想 2.遞迴的應用 2.1 單向連結串列的轉置 2.2 單向排序連結串列的合併 2.3 漢諾塔問題 2.4 全排列問題 2.5 逆序列印單鏈表中的偶數結點 2.6 八皇后問題 3.小結 1.遞迴的思想 遞迴是一種數學上分而自治的思想: 將
詳解遞迴下降分析法
通過一個具體的例子來學習遞迴下降分析法。 假設有文法: E -> TE` E` -> +TE` | -TE` | ε T -> FT` T` -> *FT` | /FT` | ε F -> (E) | i 現在希望用遞迴下降的方式寫
由淺入深探究mysql索引結構原理、效能分析與優化
第一部分:基礎知識 第二部分:MYISAM和INNODB索引結構 1、 簡單介紹B-tree B+ tree樹 2、 MyisAM索引結構 3、 Annode索引結構 4、 MyisAM索引與InnoDB索引相比較 第三部分:MYSQL優化 1、表資料型別選擇 2、sql語句優化 (1) 最左字首
遞迴樹分析遞迴演算法的時間複雜度
T(n) = T(n/3) + T(2n/3) + n 其遞迴樹如下圖所示: 可見每層的值都為n,從根到葉節點的最長路徑是: 因為最後遞迴的停止是在(2/3)kn == 1.則 於是 即T(n) = O
帶你玩轉Visual Studio——效能分析與優化
上一篇文章帶你玩轉Visual Studio——VC++的多執行緒開發講了VC++中多執行緒的主要用法。多執行緒是提升效能和解決併發問題的有效途經。在商用程式的開發中,效能是一個重要的指標,程式的效能優化也是一個重要的工作。 找到效能瓶頸 二八法則適
Top團隊大牛帶你玩轉Android效能分析與優化
第1章 課程導學與學習指南 效能優化是高階工程師必備的技能,本課程將帶你由表及裡學到國內Top團隊對效能問題的體系化解決方案,滿滿的乾貨讓你輕鬆晉級高階工程師。 1-1 課前必讀(不看會錯過一個億) 1-2 課程導學試看
遞迴程式設計心得與體會
用遞迴設計出來的程式總是簡潔易讀,極具美感。但是對於剛入門的學者來說,當遇到遞迴場景時,自己卻難以正確的設計出合理的遞迴程式。博主曾經也是困惑不已,寫的多了,也就漸漸的熟悉了遞迴設計。特談一下自己的感受
(考研必看)最全資料結構排序演算法效能分析與比較!!!
資料結構所有排序演算法效能分析與比較 轉載請標明出處weixin_44254963或璇小姐 通過對資料結構的學習,我發現數據結構中各種排序演算法的排序方法,過程,以及時間效能,空間效能都比較容易混淆,現就這些情況做如下總結,希望對大家有所幫助。 起泡排序(氣泡排序) 首先取第一個