有a、b、c三個塔柱,8個圓盤在塔柱a上,大小隨高度增加而減小,將8個圓盤從塔柱a移動到塔柱b,遵循以下規則:
每次只移動乙個圓盤
不允許將大圓盤移動到小圓盤之上
在用遞迴解決此問題時,遞迴程式應包含以下引數:
需要移動圓盤數量
開始的塔柱名字
最終所在的塔柱名字
臨時儲存圓盤的塔柱名字
據此得到如下函式原型:
void
movetower
(int n,
char start,
char finish,
char tmp)
;
將最上面的n-1個圓盤從開始所在的塔柱移動到臨時塔柱上
將最底下的乙個圓盤從開始所在的塔柱移動到最終所在塔柱上
將n-1個圓盤從臨時塔柱移回到最終所在塔柱上
操作輸出函式:
void
movesingledisk
(char start,
char finish)
具體實現函式:
void
movetower
(int n,
char start,
char finish,
char tmp)
else
}
給定乙個整數集合和乙個目標值,確定是否可以找到這個整數集合的乙個子集,子集的和等於指定的目標值
其判定函式如下:
bool
subsetsumexists
(set<
int>
& set,
int target)
;
選擇乙個元素,然後將其從集合中刪除,建立乙個更小的集合。
bool
subsetsumexists
(set<
int>
& ji_he,
int target)
else
}
這個遞迴策略包含兩個分支,一種包含特定的元素,另一種不包含該特定元素,可以稱其為包含/排除模式,在涉及陣列和字串的應用中應注意識別。
對於乙個給定的字元集合可以產生其所有的排列組合。
實現函式如下:
set
generatepermutations
(string str)
else}}
return result;
}
遞迴與分治策略
1 全排列問題 設r n 是要進行排列的n個元素。集合x中元素的全排列記為perm x 求r n 的全排列perm r n 用遞迴演算法求解 1 找出遞迴子結構性質 即原問題的解包含了子問題的解,且子問題的描述與原問題相同。這就可以用子問題的解來構造原問題的解。設r i r n 這是乙個子問題。設 ...
遞迴與分治策略
1.遞迴 直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。1 階乘函式 include using namespace std int main int factorial int n 2 fibonacci數列 include using namespace st...
分治策略與遞迴
先看 資料結構與演算法分析 中對分治策略的解釋 把問題分成兩個大致相等的子問題,然後再遞迴地對他們進行求解,這是 分 治 階段將兩個子問題的解合併到一起並可能再做些少量的附加工作,最後得到整個問題的解。由定義可以看出,分治需要進行兩步操作 分 將問題恰當的劃分為需要迭代處理的兩個子問題,治 將兩個子...