對於棧有些問題還不是很熟悉,所以暫時需要些時間去理解,需要多寫些**去體會,,棧還有乙個重要應用是在程式語言中實現遞迴,所以這次主要是講遞迴的實現,大家熟悉的階乘函式,2階fibonacci數列和ackerman函式等,其次還有的資料結構,如二叉樹、廣義表等,由於結構本身固有的遞迴特性,則它們的操作可遞迴的描述,另外還有一類問題,雖然問題本身沒有明顯的遞迴結構,但是遞迴求解比迭代求解更簡單,如八皇后問題、hanoi塔問題等。
遞迴是一種數學上分而治之的思想,它將大型複雜問題轉化為與原問題相同但規模較小的問題進行處理,數學表示如下:
下面我以乙個八皇后問題來說一下這兒的遞迴問題,在乙個8x8西洋棋中,有8個皇后,每個皇后佔一格,要求皇后間不會出現相互「攻擊」的現象,即不能有兩個皇后處在同一行,同一列或者同一對角線上。那麼怎麼來實現這個想法呢?下面是我的演算法思路:先給兩個了、變數i,j賦值為1,從第i行開始,恢復j的當前值,判斷第j個位置。1、位置j可放入皇后,標記位置(i,j),i++,j = 1; 2、位置j不可放入皇后,j++,i = 1; 3、當j>8時候,j--,繼續上述迴圈; 4、第八行有位置可以放入皇后。
實現**如下:
1 #include 2queen#define n 8
34 typedef struct
_tag_pos
5 pos;910
static
char board[n+2][n+2
];11
static pos pos = , , };
12static
int count = 0;13
14void
init()
15
25for(i=1; i<=n; i++)
2631}32
}3334void
display()
35
44 printf("\n"
);45}46
}4748int check(int i, int
j)4962}
6364
return
ret;65}
6667
void find(int
i)68
77else
7887}88
}89}90
91int
main()
92
編譯結果如下圖:
當不斷按enter的時候,會陸續出現solution一直到solutioin92,再按enter會退出了。如下圖
小結:
遞迴是一種將問題分而治之的思想,解決問題的時候首先就要建立遞迴的模型;
如上圖到solution92的時候就結束了,所以解決遞迴問題首先要有邊界條件,否則將死迴圈;
棧與遞迴的實現
對於棧有些問題還不是很熟悉,所以暫時需要些時間去理解,需要多寫些 去體會,棧還有乙個重要應用是在程式語言中實現遞迴,所以這次主要是講遞迴的實現,大家熟悉的階乘函式,2階fibonacci數列和ackerman函式等,其次還有的資料結構,如二叉樹 廣義表等,由於結構本身固有的遞迴特性,則它們的操作可遞...
3 3棧與遞迴的實現
棧還有乙個重要的應用是在程式語言中實現遞迴。遞迴是程式設計中乙個強有力的工具。其一,很多數學函式是遞迴定義的 其二,有些資料結構,如二叉樹 廣義表等,它們本身的結構有遞迴特性,則它們的操作可遞迴 地描述 其三,雖然有些問題本身沒有明顯的遞迴結構,但是利用遞迴比利用迭代求解更簡單,如八皇后問題 han...
棧與遞迴實現迷宮問題求
在學習了資料結構的棧和佇列的相關知識以後,我接觸到了棧的一些應用,其中迷宮問題就是一種棧的應用。在這個迷宮中我們認為0是可以通過的路徑,而1就相當於牆,是不可以通過的。基本的實現方法其實是蠻簡單的,我們知道棧的特點就是先進後出,後進先出,所以,當我們從入口開始,將可以通過的路徑的座標壓棧,壓入棧中,...