遞迴
遞迴這種演算法一般應用於二叉樹遍歷,深度優先搜尋等這些方面
什麼是遞迴?
常規的定義:在程式語言中,函式func直接或者間接呼叫函式本身,則該函式稱之為遞迴函式。
假設這樣的乙個場景,我們在電影院中看電影,但是這時候你不知道自己在第幾排,於是可以問前面的人他在第幾排,前面的人也不知道自己在第幾排,於是又問他前面的人,以此類推,直到第一排的人告訴第二排的人,第二排的人告訴第三排的人,於是最終傳到自己這一排,通過得知自己前一排是第幾排,就可以知道自己在第幾排,這就可以看做是一種遞迴的·思想
問前排人是第幾排?–》函式
所有的遞迴問題都可以用遞迴公式來表示,所以要用遞迴來解決問題,關鍵就是先找到遞迴公式
f(n) = f(n-1)+1
f(1) = 1
f(n) 表示你當前是第幾排,f(n-1)前面一排所在的排數,f(1)=1表示第一排的人知道自己是第幾排
int f(int n)
遞迴需要滿足3要素:
1.乙個父問題可以拆分成為若干個子問題,並且若干個子問題的結果彙總起來就是父問題的答案
2.父問題和子問題,解題思路必須完全一致,只是資料規模不同
3.存在終止條件
問題在不斷拆分的同時,一定要在某個節點終止拆分,得到乙個明確的答案
問題:假設有n個台階,每次可以跨1個台階或者2個台階,請問走完這n個台階一共有多少種走法?
1.假設有乙個台階,一共有(1)種走法
2.假設有2個台階,一共有2種走法(1,1),(2)
3.假設有3個台階,一共有()種走法?(1,1,1),(1,2),(2,1)
…可以根據第一步的走法進行分類
第一類是第一步走了1個台階
第二類是第一步走了2個台階
所以n個台階的走法就等於先走1個台階後,n-1個台階的走法+先走2個台階後,n-2個台階的走法
f(n)=f(n-1)+f(n-2)
f(1) = 1能否作為終止條件?
n=2,f(2) = f(1)+f(0),如果終止條件只有f(1)=1,f(2)就無解,因為f(0)的值無法確定,把f(2)=2作為乙個終止條件
終止條件有兩個:
f(1)=1;
f(2)=2;
n=3,f(3)=f(2)+f(1)=3
n=e,f(4)=f(3)+f(2)=5
因此,地推公式:
f(1)=1
f(2)=2
f(n)=f(n-1)+f(n-2)
推導出遞迴**如下
測試**intf(
int n)
氣泡排序public
class
test
}public
static
intf
(int n)
}
/**
* 陣列氣泡排序
*/public
class
array04maopao
;// 外層控制迴圈次數
for(
int j =
0; j
1; j++)}
} system.out.
println
(arrays.
tostring
(array));
}}
演算法 基礎 常見排序演算法
如果h位比flag小,則需要交換,在此處進行。if l 從l位開始,如果比flag小就將l向右移動,即l while l flag 如果l位比flag大,則需要交換,在此處進行 if l flag 一趟結束,判斷flag兩端的子陣列是否需要排序 if l low if h public static...
C 常見基礎演算法
namespace 面試常見演算法 region 1 2 3 4 m static int test1 int m else return sum endregion region 1,2,3,4四個數字,能夠組成多少互不相同無重複數字的三位數 static void test2 bw,sw,gw ...
單鏈表的常見基礎演算法(二)
1 求單鏈表中的乙個最小值 2 單鏈表逆置 3 l為帶頭結點的單鏈表,實現從尾到頭反向輸出每個結點值 4 遞迴刪去不帶頭結點的單鏈表中所有值為x的結點 5 無序鍊錶中刪除所有值為x的結點並釋放其空間 6 帶頭結點的單鏈表中刪除所有介於給定的兩個值之間的元素 7 帶頭結點的單鏈表中刪除乙個最小值結點 ...