1. 程式人生 > >遞迴的效能分析與經典運用

遞迴的效能分析與經典運用

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或璇小姐 通過對資料結構的學習,我發現數據結構中各種排序演算法的排序方法,過程,以及時間效能,空間效能都比較容易混淆,現就這些情況做如下總結,希望對大家有所幫助。 起泡排序(氣泡排序) 首先取第一個