無聊時總結總結演算法之01遞迴

2021-07-09 22:51:18 字數 1887 閱讀 8976

(1)階乘

n! = n * (n-1) * (n-2) * …* 1(n>0)

//first problem 階乘n!

int jiecheng(int n)

(2)河內塔問題

//second problem  河內塔問題

/* (1)把1座上(n-1)個盤子借助3座移到2座。

(2)把1座上第n個盤子移動3座。

(3)把2座上(n-1)個盤子借助1座移動3座。

如果用heneita(n,a,b,c)表示把1座n個盤子借助2座移動到3座。

(1)步上是 heneita(n-1,1,3,2)

(2)cout<

}

(3)全排列

如1,2,3三個元素的全排列為:

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

//thrid problem 全排列

/*void swap(int &a,int &b)

這是錯的?

void swap(int a,int b)

這是對的!!!

*//*

void swap(int &a,int &b)

//對的!!!!

*/void swap(int

*a,int

*b)//對的!!!

void quanpailie(int* list,int start, int end)

else}}

(4)斐波那契數列

斐波那契數列指的是這樣乙個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …

int fibonacci(int timen)

(5) 八皇后問題

問題:

經典的八皇后問題,即在乙個8*8的棋盤上放8個皇后,使得這8個皇后無法互相攻擊( 任意2個皇后不能處於同一行,同一列或是對角線上),輸出所有可能的擺放情況。

解析:8皇后是個經典的問題,如果使用暴力法,每個格仔都去考慮放皇后與否,一共有264 種可能。所以暴力法並不是個好辦法。由於皇后們是不能放在同一行的, 所以我們可以去掉「行」這個因素,即我第1次考慮把皇后放在第1行的某個位置, 第2次放的時候就不用去放在第一行了,因為這樣放皇后間是可以互相攻擊的。 第2次我就考慮把皇后放在第2行的某個位置,第3次我考慮把皇后放在第3行的某個位置, 這樣依次去遞迴。每計算1行,遞迴一次,每次遞迴裡面考慮8列, 即對每一行皇后有8個可能的位置可以放。找到乙個與前面行的皇后都不會互相攻擊的位置, 然後再遞迴進入下一行。找到一組可行解即可輸出,然後程式回溯去找下一組可靠解。

我們用乙個一維陣列來表示相應行對應的列,比如c[i]=j表示, 第i行的皇后放在第j列。如果當前行是r,皇后放在哪一列呢?c[r]列。 一共有8列,所以我們要讓c[r]依次取第0列,第1列,第2列……一直到第7列, 每取一次我們就去考慮,皇后放的位置會不會和前面已經放了的皇后有衝突。 怎樣是有衝突呢?同行,同列,對角線。由於已經不會同行了,所以不用考慮這一點。 同列:c[r]==c[j]; 同對角線有兩種可能,即主對角線方向和副對角線方向。 主對角線方向滿足,行之差等於列之差:r-j==c[r]-c[j]; 副對角線方向滿足, 行之差等於列之差的相反數:r-j==c[j]-c[r]。 只有滿足了當前皇后和前面所有的皇后都不會互相攻擊的時候,才能進入下一級遞迴。

[牛人的 n皇后問題的兩個最高效的演算法]()

無聊時總結總結演算法之08桶排序

桶排序 bucket sort 或所謂的箱排序的原理是將陣列分到有限數量的桶子裡,然後對每個桶子再分別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 最後將各個桶中的資料有序的合併起來。排序過程 假設待排序的一組數統一的分布在乙個範圍中,並將這一範圍劃分成幾個子範圍,也就是桶 ...

無聊時總結總結演算法之07堆排序

二叉堆的定義 二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個...

面試總結 演算法篇

leetcode是經同學介紹的 據說有很大一部分演算法面試題都在leetcode的題庫中,甚至是完全一樣,既然想好要學點什麼就要一點點慢慢的啃吧。題目涉及別家 版權,就不在這裡說什麼了,本來還想每日一刷讓大家幫忙做個監督,估計不太合適了。為了更好的自己,加油!用了三天左右空餘時間,把sql簡單刷了一...