遞推和遞迴

2021-08-20 16:00:03 字數 1258 閱讀 5749

貪心的思想可以用一句話來歸納,「每步取優」。很好理解,假設你的程式要走i=1~n共n步,那麼保證你的第i步走出的是當前這一步的最優值。這樣的解題方法叫做貪心演算法。可見貪心演算法並不是乙個全面的列舉方法而是若干結果中的一種,僅僅一種而已。但這種演算法是不是最優解它就不能完全保證了。

一般每個可以使用遞迴演算法求解的題目都可以寫出乙個遞迴函式。假設這個函式是f(),那麼f()應該為你可以表示你的解。而題目的主要問題就是把乙個大問題轉換為若干個性質相同的子問題。注意是性質相同,因為只有性質相同我們才能使用同乙個函式來表示。而求解的過程是從最後一步,當然每一步都會用到比自己要小的子問題的值,那麼要呼叫程式來求出這些子問題的解,一步步返回最後得到最後的問題的解。也可以理解為求解過程是「反向」的。因為變數會是逐漸變小的。

與遞迴演算法一樣,必定會寫出乙個轉移方程,而每個可以用遞迴方法解決的問題都可以用遞推方法解決。我們要做的依然是把大問題轉變為性質相同的子問題的過程。而求解過程與遞迴方法正好相反,是從最小規模的子問題開始求解,最後求到最大規模的解。與遞迴不一樣的是,遞迴可以只求我們所需要的子問題的解,而遞推演算法在每一步計算求解的過程中並不知道下一步需要用什麼樣的子問題的值,於是程式必須把所有的可能性都求出來。造成了很多的計算浪費。但遞推演算法有乙個遞迴演算法永遠做不到的優勢就是「滾動性」。當遞推演算法求解完第一行的子問題的時候進行第二行的處理,第二行會用到上一行的子問題值。當處理第三行的時候第一行的值就沒有用了,所以我們可以把單數行的值都存到第一各陣列裡,雙數行的值都存到第二個陣列裡。這樣可以就可以實現滾動,原來原本要開[1..n,1..n]大小的陣列現在就可以只開[1..n,1..2]大小的陣列了,把空間複雜度從o(n2)的複雜度變為o(2n)的複雜度。這就是所謂的「遞推省空間費時間,遞迴省時間費空間」的道理。

動態規劃演算法,動態規劃演算法可以理解為是遞迴演算法的乙個延伸。因為單純的遞迴演算法是會出現很多子問題的重疊的,這樣還是會造成同一問題的重複運算。所以我們要找乙個辦法來避免重複的運算。於是就出現了動態規劃。簡單地說,動態規劃依然是把乙個大問題分為若干性質相同的子問題,而這些子問題裡面會有若干的重疊。(下面的例題舉例)。為了當出現子問題重疊的時候不重複運算。我們就需要把所有的已經求出的子問題都存下來,判斷這個子問題是否已經算過,算過了就不要再算了。如果沒算過就算一遍下次在遇到這個子問題就可以不算了。因此我們必須開出乙個大小為[1..n,1..n]的陣列來儲存,又因為每次都有可能會遇到不同的行的子問題,所以我們必須把陣列全部留住,所以就不能實現遞推演算法的「滾動性」。但動態規劃演算法可以節省大量的時間。假設所有的子問題都不重疊它的時間複雜度會和遞迴一樣。而如果優有大量的子問題重疊,那麼會發現時間複雜度會有明顯的降低。可以提高運算效率,縮短運算時間。

遞迴和遞推

遞迴的概念 乙個函式 過程 概念或資料結構,如果在其定義或說明內部直接或間接地出現有其本身的引用,或者是為了描述問題的某一狀態,必須用到它的上一狀態,而描述上一狀態,又必須用到它的上一狀態 這種用自己來定義的方法,稱之為遞迴或者遞迴定義。在程式設計中,過程或函式直接或者間接呼叫自己,就稱為遞迴呼叫 ...

遞推和遞迴

一 遞推演算法基本思想 遞推演算法是一種理性思維模式的代表,其根據已有的資料和關係,逐步推導而得到結果。遞推演算法的執行過程如下 1 根據已有的 結果和關係,求解中間結果 2 判定是否達到要求,如果沒有達到,則繼續根據已知結果和關係求解中間結果 如果滿足要求,則表示尋找到乙個正確的答案。遞推演算法往...

遞迴和遞推

從 1 n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入格式 輸入乙個整數n。輸出格式 每行輸出一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。資料範圍 1 n 15 ...