對於遞迴和遞推的非常專業的定義和解釋在這裡就不再copy了,私以為演算法的關鍵是運用和實踐,就好比圍棋,規則簡單但是入門的門檻很高,就算熟練記憶規則也沒法下好一盤棋。likewise,對於演算法學習,最關鍵是有乙個演算法的慣性在腦子裡,這要比熟記定義重要得多,因為這需要深刻的掌握。對於演算法的學習需要的是長久的訓練和揣摩。無他,唯手熟爾!
一、遞迴:自身呼叫自身的一種演算法形式。這也是我們平時所說的dfs(深度優先搜尋)。
q1、如何構建遞迴搜尋樹?
q2、當前是遞迴搜尋樹的第幾層?
q3、從哪一層開始遞迴?
q4、選還是不選?
q5、如何標記選還是不選的狀態?
q6、邊界是什麼?即退出遞迴的條件是什麼?
q7、什麼是回溯?
q8、什麼是恢復現場?為什麼要恢復現場?
q9、如何確定列舉的順序?
做題前思考清楚這些問題,可以說就是入門的第一步!
例一】
從 1~n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。此題本質:有n個數,而且是以1.2.3.4.5...n的順序排放,那麼某個位置的數字是放還是不放決定了整體的排列。輸入格式
輸入乙個整數n。
輸出格式
每行輸出一種方案。
同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。
對於沒有選任何數的方案,輸出空行。
本題有自定義校驗器(spj),各行(不同方案)之間的順序任意。
資料範圍
1≤n≤15
輸入樣例:
輸出樣例:3
3
22 3
11 3
1 21 2 3
此題可以用深度優先搜尋解決,因為放還是不放這一問題可以抽象成二叉樹,深搜就是先序遍歷二叉樹。
#include#include#include#includeusing namespace std;
const int n=16;
int st[n];//0代表不選,1代表選,2代表空
int n;
void dfs(int u)
小明開了一家糖果店。
他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。
糖果不能拆包賣。
小朋友來買糖的時候,他就用這兩種包裝來組合。
當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。
你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。
大於17的任何數字都可以用4和7組合出來。
本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。
輸入格式
兩個正整數 n,mn,m,表示每種包裝中糖的顆數。
輸出格式
乙個正整數,表示最大不能買到的糖數。
資料範圍
2≤n,m≤10002≤n,m≤1000,
保證資料一定有解。
輸入樣例:
4 7
輸出樣例:
17
暴力搜尋打表
#include#include#include#includeusing namespace std;
bool dfs(int x,int i,int j)
int main()
cout<2、遞推:按照某種策略向後遞進,要填充後面的內容往往需要用到前面的內容。
最簡單的遞推:斐波那契數列
以下數列0 1 1 2 3 5 8 13 21 …被稱為斐波納契數列。
這個數列從第3項開始,每一項都等於前兩項之和。
輸入乙個整數n,請你輸出這個序列的前n項。
輸入格式
乙個整數n。
輸出格式
在一行中輸出斐波那契數列的前n項,數字之間用空格隔開。
資料範圍
0輸入樣例:
5
輸出樣例:
0 1 1 2 3
#include#include#include#includeusing namespace std;
int main()
for(int i=1;i<=n;i++)
{cout《未完待續
遞推與遞迴
遞推與遞迴 遞推像是多公尺諾骨牌,遞迴是大事化小。遞推的效率更高 遞推 斐波那契數列 例 母親為兒子的四年大學學費準備了一筆存款,兒子每月月底取下月生活費1000元。銀行年利率為 1.71 畢業時連本帶息要取出 1000 元。則要存入多少錢。include define rate 0.0171 in...
遞推與遞迴
遞迴 將問題規模為n的問題,降解成若干個規模為n 1的問題,依次降解,直到問題規模可求,求出低階規模的解,代入高階問題中,直至求出規模為n的問題的解。遞推 構造低階的規模 如規模為i,一般i 0 的問題,並求出解,推導出問題規模為i 1的問題以及解,依次推到規模為n的問題。遞迴包括回溯和遞推兩個過程...
遞迴與遞推
1 遞迴與遞推的定義 前者是 後者是對以前的問題進行計算,以得出當前問題的大結果。2 它們的典例和運用遞迴 遞推dfs,搜尋與回溯 動態規劃 用遞推能做的,記憶化搜尋定能夠實現 遞推僅能求方案數,求具體方案需用遞迴 3 各種關於遞推的例題 爬樓梯 數樓梯 兔子問題 includeusing name...