遞迴定義:遞迴定義由兩部分組成。第一部分成為錨或者基例,列出了產生集合中其他元素的基本元素。第二部分給出由基本元素或已有物件產生新物件的構造規則。這些規則被反覆使用,從而產生新物件。
當乙個函式呼叫其他函式時,系統會把當前函式的活動記錄儲存在執行時棧。
尾遞迴:在每個函式實現的末尾只使用乙個遞迴呼叫。如:
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的結果。二分查詢 終止條件 找到終止 目標值等...