棧與遞迴的實現

2021-09-20 14:49:58 字數 1631 閱讀 9170

對於棧有些問題還不是很熟悉,所以暫時需要些時間去理解,需要多寫些**去體會,,棧還有乙個重要應用是在程式語言中實現遞迴,所以這次主要是講遞迴的實現,大家熟悉的階乘函式,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 2

#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

queen

編譯結果如下圖:

當不斷按enter的時候,會陸續出現solution一直到solutioin92,再按enter會退出了。如下圖

小結:

遞迴是一種將問題分而治之的思想,解決問題的時候首先就要建立遞迴的模型;

如上圖到solution92的時候就結束了,所以解決遞迴問題首先要有邊界條件,否則將死迴圈;

棧與遞迴的實現

對於棧有些問題還不是很熟悉,所以暫時需要些時間去理解,需要多寫些 去體會,棧還有乙個重要應用是在程式語言中實現遞迴,所以這次主要是講遞迴的實現,大家熟悉的階乘函式,2階fibonacci數列和ackerman函式等,其次還有的資料結構,如二叉樹 廣義表等,由於結構本身固有的遞迴特性,則它們的操作可遞...

3 3棧與遞迴的實現

棧還有乙個重要的應用是在程式語言中實現遞迴。遞迴是程式設計中乙個強有力的工具。其一,很多數學函式是遞迴定義的 其二,有些資料結構,如二叉樹 廣義表等,它們本身的結構有遞迴特性,則它們的操作可遞迴 地描述 其三,雖然有些問題本身沒有明顯的遞迴結構,但是利用遞迴比利用迭代求解更簡單,如八皇后問題 han...

棧與遞迴實現迷宮問題求

在學習了資料結構的棧和佇列的相關知識以後,我接觸到了棧的一些應用,其中迷宮問題就是一種棧的應用。在這個迷宮中我們認為0是可以通過的路徑,而1就相當於牆,是不可以通過的。基本的實現方法其實是蠻簡單的,我們知道棧的特點就是先進後出,後進先出,所以,當我們從入口開始,將可以通過的路徑的座標壓棧,壓入棧中,...