資料結構與演算法之遞迴與8皇后問題

2021-09-26 12:13:13 字數 902 閱讀 5928

遞迴定義:遞迴定義由兩部分組成。第一部分成為錨或者基例,列出了產生集合中其他元素的基本元素。第二部分給出由基本元素或已有物件產生新物件的構造規則。這些規則被反覆使用,從而產生新物件。

當乙個函式呼叫其他函式時,系統會把當前函式的活動記錄儲存在執行時棧。

尾遞迴:在每個函式實現的末尾只使用乙個遞迴呼叫。如:

void tail(int i)

}

尾遞迴只是乙個變形的迴圈,對於c++等語言優勢並不明顯,但是在prolog等沒有明確迴圈結構的語言中,尾遞迴的優勢十分突出。

4. 間接遞迴:f()->g()->f()

5. 巢狀遞迴:函式不僅根據其自身定義,而且還作為該函式的乙個引數進行傳遞。

6. 不合理遞迴:使用遞迴的好處是邏輯上的簡單性和可讀性,其代價是降低了執行速度,與非遞迴方法相比,在執行時棧中儲存的內容更多。如果遞迴的次數太多,就會用盡棧空間並導致程式崩潰。

7. 回溯:在嘗試某些路徑不成功後,可以系統地嘗試從某一點出發的縮影可能路徑。

例子:八皇后問題

#include "stdafx.h"

#include bool cols[8], left[15], right[15]; //列,左對角線,右對角線是否被占用

int queen[8][8] = ;

int totalresult = 0;

void initialize()

for (int i = 8; i < 15; i++)

}void printqueen()

printf("\n");

}}void pushqueen(int row)

}else

break;}}

}}int main()

資料結構與演算法 遞迴 八皇后

八皇后問題介紹 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。由於西洋棋是乙個8 8的棋盤,而且棋盤中總共需要...

資料結構與演算法之美 8 遞迴演算法

遞迴嚴格說起來不算一種演算法,只能說是一種問題處理思想或者問題處理技巧。只要問題同時滿足以下三個條件,就可以考慮用遞迴來解決 乙個問題的解可以分解為幾個子問題的解 這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣 存在遞迴終止條件 個人覺得,寫遞迴 最關鍵的是寫出遞推公式,找到終止條件...

資料結構與演算法之遞迴

以階乘舉例 def factorial n 階乘 if n 0 return 1 else return n factorial n 1 函式每被呼叫一次就會被壓棧,而且引數減一再次呼叫再次壓棧,當達到終止條件時,遞迴就會終止,從棧底往上返回return的結果。二分查詢 終止條件 找到終止 目標值等...