演算法 遞迴基礎

2021-10-04 23:31:04 字數 1971 閱讀 7950

資料結構:int st[n];//記錄每個位置當前的狀態:0還沒考慮,1表示選它,2表示不選它

#include

#include

#include

#include

using namespace std;

const

int n =16;

int n;

int st[n]

;//記錄每個位置當前的狀態:0還沒考慮,1表示選它,2表示不選它

//遞迴思路 : 1.邊界 2.遞迴 3.恢復現場

void

dfs(

int u)

puts(""

);return;}

st[u]=2

;dfs

(u+1);

//遞迴

st[u]=0

;//恢復現場

st[u]=1

;dfs

(u+1);

st[u]=0

;}intmain()

##記錄方案實現:

#include

#include

#include

#include

#include

using namespace std;

const

int n =16;

int n;

int st[n]

;//記錄每個位置當前的狀態:0還沒考慮,1表示選它,2表示不選它

vectorint>> ways;

//遞迴思路 : 1.邊界 2.遞迴 3.恢復現場

void

dfs(

int u)

ways.

push_back

(way)

;return;}

st[u]=2

;dfs

(u+1);

//遞迴

st[u]=0

;//恢復現場

st[u]=1

;dfs

(u+1);

st[u]=0

;}intmain()

return0;

}

資料結構:int st[n]; bool used[n];

#include

using namespace std;

const

int n =10;

int n;

int st[n]

;// 當前位上填哪個數

bool used[n]

;// 數是否用過

//遞迴順序:每一位上有哪個數可用

void

dfs(

int u)

puts(""

);return;}

//依次列舉當前哪個數可用

for(

int i=

1;i<=n;i++)}

}int

main()

避免重複可以人為地定順序

剪枝會快3倍

#include

#include

#include

#include

using namespace std;

const

int n =30;

int n,m;

int way[n]

;void

dfs(

int u,

int start)

for(

int i=start;i<=n;i++)}

intmain()

演算法基礎 遞迴演算法

遞迴演算法是將重複問題分解為同類的子問題而解決問題的方法,其核心思想是分治策略。簡單來說就是自己呼叫自己。直到達到退出遞迴的條件,則完成遞迴。1 找整個遞迴的終止條件 遞迴應該在什麼時候結束?3 本級遞迴應該做什麼 在這一級遞迴中,應該完成什麼任務?優點 遞迴的核心思想就是將乙個大問題,拆解成乙個小...

基礎演算法 遞迴

遞迴用處很廣,可以將複雜問題簡單化。很多問題都可以使用遞迴演算法或結合遞迴演算法得到解決。那麼,設計遞迴演算法的關鍵是什麼?其關鍵之處在於,正確分析出2種型別的節點 出口節點和入口節點 一 演算法關鍵 出口節點 入口節點 遞迴問題可看做是由各個節點構成,而所有節點只能分為出口節點 入口節點兩類。1 ...

演算法基礎 遞迴

乙個函式呼叫其自身,就是遞迴 遞迴和普通函式呼叫一樣是通過棧實現的 替代多重迴圈 解決本來就是用遞迴形式定義的問題 將問題分解為規模更小的子問題進行求解 例題 n皇后問題 n皇后問題 輸入整數n,要求n個西洋棋的皇后,擺在n n的棋盤上,互相不能攻擊,輸出全部方案。輸入乙個正整數n,則程式輸出n皇后...