優點:**更簡潔清晰,可讀性更好
實際上遞迴的**更清晰,但是從學習的角度要理解遞迴真正發生的什麼,是如何呼叫的,呼叫層次和路線,呼叫堆疊中儲存了什麼,可能是不容易。但是不可否認遞迴的**更簡潔。
缺點:由於遞迴需要系統堆疊,所以空間消耗要比非遞迴**要大很多.而且,如果遞迴深度太大,可能會造成棧溢位
遞迴:
詳見《遞迴那些事一》
1、遞迴分為兩個階段:
1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;(遞推更多是數學概念,也就是需要找出問題的規律,不必深究)
2)回歸:當獲得最簡單的情況後, 逐步返回, 依次得到複雜的解.
//遞迴法求第n個數的斐波那契數列
long
factorial
(int n)
//遞迴法計算n的階乘
long
factorial
(int n)
迭代:1、利用變數的原值推算出變數的乙個新值.如果遞迴是自己呼叫自己的話,
迭代就是a不停的呼叫b
2、優點:
1)迭代效率高,執行時間只因迴圈次數增加而增加;
2)沒什麼額外開銷,空間上也沒有什麼增加;
3、缺點:
1) 不容易理解;
2) **不如遞迴簡潔;
3) 編寫複雜問題時困難。
注意: 能用迭代的不用遞迴,遞迴呼叫函式,浪費空間,並且遞迴太深容易造成堆疊的溢位
//迭代法計算n的階乘
long
factorial
(int n)
result;
}
遞推:1、遞推演算法是一種簡單的演算法,即通過已知條件,利用特定關係得出中間推論,直至得到結果的演算法。遞推演算法分為順推和逆推兩種。(其實和動歸接近的)
2、相對於遞迴演算法,遞推演算法免除了資料進出棧的過程,也就是說,不需要函式不斷的向邊界值靠攏,而直接從邊界出發,直到求出函式值。
#define size 20
intmain()
system
("pause");
return0;
}
遞迴問題中想到思路本身不非常難,真正的難點在於如何優化。
1、考慮是否重複計算
如果你使用遞迴的時候不進行優化,是有非常非常非常多的子問題被重複計算的。因此,使用遞迴的時候,必要須要考慮有沒有重複計算,如果重複計算了,一定要把計算過的狀態儲存起來。
2、考慮尾遞迴
對於遞迴的問題,我們一般都是從上往下遞迴的,直到遞迴到最底,再一層一層著把值返回。
不過,有時候當 n 比較大的時候,例如當 n = 10000 時,那麼必須要往下遞迴10000層直到 n <=1 才將結果慢慢返回,如果n太大的話,可能棧空間會不夠用。這個時候,就可以用尾遞迴優化來解決。
顧名思義,尾遞迴就是從最後開始計算, 每遞迴一次就算出相應的結果, 也就是說, 函式呼叫出現在呼叫者函式的尾部, 因為是尾部, 所以根本沒有必要去儲存任何區域性變數。直接讓被呼叫的函式返回時越過呼叫者, 返回到呼叫者的呼叫者去。
1、機械人走方格v6
2、分解因數
3、k之字元是a還是b
基礎演算法整理(1) 遞迴與遞推
遞推演算法是一種用若干步可重複的簡運算 規律 來描述複雜問題的方法.簡單來說,關於遞推和遞迴,概念如下 void digui void ditui 怎麼樣,用簡潔明快的方法就能讓你明白演算法的真諦是不是很爽hhhhh 遞迴遞推作為基礎演算法其實並不難,但還是有必要舉一些例題來看看 1.小猴子第一天摘...
演算法反芻 遞迴與遞推
對於遞迴和遞推的非常專業的定義和解釋在這裡就不再copy了,私以為演算法的關鍵是運用和實踐,就好比圍棋,規則簡單但是入門的門檻很高,就算熟練記憶規則也沒法下好一盤棋。likewise,對於演算法學習,最關鍵是有乙個演算法的慣性在腦子裡,這要比熟記定義重要得多,因為這需要深刻的掌握。對於演算法的學習需...
函式遞迴 遞推與回溯 練習題
遞迴與二分法習題 二分法就是在按照從大到小或者從小到大規律排布的列表中,尋找的值通過與中間的值比較大小,從而對列表進行操作,然後再比較的迴圈過程。用遞迴的方法找出列表中的值 num 1,3,4,5,6,8,22,33,55,778,990 def search search number,num i...