演算法基礎 遞迴與回溯 遞推 迭代關係

2021-10-19 17:40:14 字數 1923 閱讀 1238

優點:**更簡潔清晰,可讀性更好

實際上遞迴的**更清晰,但是從學習的角度要理解遞迴真正發生的什麼,是如何呼叫的,呼叫層次和路線,呼叫堆疊中儲存了什麼,可能是不容易。但是不可否認遞迴的**更簡潔。

缺點:由於遞迴需要系統堆疊,所以空間消耗要比非遞迴**要大很多.而且,如果遞迴深度太大,可能會造成棧溢位

遞迴

詳見《遞迴那些事一》

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...