1 2 遞迴與遞推

2022-05-05 05:27:09 字數 1699 閱讀 7272

對於乙個待求解的問題,我們由已知的某個小問題進而一步一步推向該問題的方法稱為遞推

遞迴正好與遞推的方向相反,它是由大問題逐步分解為小問題,然後回溯到大問題進行解決的方法。

列舉形式

狀態空間規模

一般遍歷方式

多項式nk,k為常數

迴圈、遞推

指數kn,k為常數

遞迴、位運算

排列n!

遞迴、c++ next_permutation

組合$\binom$

遞迴+剪枝

把乙個問題分解成若干個規模更小的同類子問題,對這些子問題求解,然後在回溯時通過他們推導出原問題的解。

可以通過維護乙個棧,將呼叫函式和返回函式的壓棧出棧過程進行模擬,從而將遞迴實現迴圈。

1. 0301 遞迴實現指數型列舉

#include#includeusing namespace std;

vectorans;

int n, flag;

void dfs(int dep, int idx)

2. 0302 遞迴/非遞迴實現組合型列舉

//遞迴型

#include#includeusing namespace std;

vectorans;

int n, m;

void dfs(int x)

//遞推型

#include#includeusing namespace std;

struct info;

int n, m;

dequest;

int main()});

while(st.size())

}if(t.t.size() == m)

4. 0201 費解的開關

#include#includeusing namespace std;

//#define _debug

int n;

vectorrecord;

const int dx = , dy = ;

void change(int x, int y, vector& s)

void set_bit(int x, int y, vector& t)

}}int get_res()

int step = get_res();

if(step <= 6) cout<5. poj1958 strange towers of hanoi

#include#includeusing namespace std;

const int n = 20;

int dp3[n], dp4[n];

int main(){

memset(dp3, 0x3f, sizeof dp3), memset(dp4, 0x3f, sizeof dp4);

dp3[0] = 0, dp4[0] = 0;

for(int i = 1; i < 13; ++i) dp3[i] = dp3[i - 1] * 2 + 1;

for(int i = 1; i < 13; ++i)

for(int j = 0; j <= i; ++j)

dp4[i] = min(dp4[i], dp4[j] * 2 + dp3[i - j]);

for(int i = 1; i < 13; ++i)

cout<6. poj1845 sumdiv

遞推與遞迴

遞推與遞迴 遞推像是多公尺諾骨牌,遞迴是大事化小。遞推的效率更高 遞推 斐波那契數列 例 母親為兒子的四年大學學費準備了一筆存款,兒子每月月底取下月生活費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...