斐波那契數列,又稱**分割數列,指的是這樣乙個數列:0、1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞迴的方法定義:f0=0,f1=1,fn=f(n-1)+f(n-2)(n>=2,n∈n*),斐波那契數列最初是為了計算兔子的出生數量而出現的,所以也叫「兔子數列」!
遞迴的本質其實程式的方法自身呼叫自身,在到達乙個條件的時候停止呼叫(所以在用遞迴的時候一定要找好基準條件,否則就是乙個列迴圈!)。這是乙個更正式的定義:
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。
乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。遞迴的能力在於用有限的語句來定義物件的無限集合。一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。
注意:(1) 遞迴就是在過程或函式裡呼叫自身;
(2) 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,稱為遞迴出口。
有如題:用遞迴求第10個數,它等於前2數之和,如用遞迴的方法實現**如下:
publicclass
test
public
static
int f(int
n)
else
}}
這個程式很簡單,自己仔細想想就可以明白了!非遞迴方法實現**:
publicclass
fab
public
static
int funt(int
index)
int f1 = 0;
int f2 = 1;
int res = 0;
/*在這裡因為第一位是寫死的,所以會多算一次
*/for(int i=0; i)
return
res;
}}
注:所有遞迴都可以用相對應的迴圈**來進行對應的功能實現!在系統中,構造樹形結構(wbs模板樹、具體專案的wbs樹、專案群樹、省市縣樹形結構等)時用到了遞迴演算法。就結構簡單的樹形結構而言,對效能的影響並不明顯,例如專案群樹,它的屬於一維的樹形結構,且採用遞迴演算法的遞迴深度小於3。但是,對於複雜的樹形結構,採用遞迴演算法實現時,響應速度普遍較慢,如wbs模板樹、具體專案的wbs樹以及省市縣樹形結構等,都是多維的,且遞迴深度不確定(至少大於3)。因此,在構造複雜的樹性結構時需要把遞迴演算法轉換為非遞迴演算法。除此之外,在其它複雜的遞迴演算法中,也可以採用將遞迴演算法轉換為非遞迴演算法的方法,以提高演算法的效能。
注:效能方面
:(這個是我在網上看的大多數人的經驗來寫的自己並沒有實驗),我用到的遞迴主要是用在建立樹形選單上面且深度沒有超過3級所以效能沒有很大的變化,網友說在構建樹形選單的時候超過3級以後特別是資料比較多,效能就會出現明顯的低下!所以在效能出現低下的時候最好用對應的迴圈來實現最好!
函式遞迴之斐波那契數列
背景 在函式遞迴問題中乙個典型問題是求解斐波那契數列 但是函式遞迴會面臨著資源的大量消耗問題 按照一種最為基本的寫法 include using namespace std long long fib long long a intmain cout fib n return0 在n 50左右時,大...
遞迴與斐波那契數列
迭代實現 def fab n a1 1 a2 1 a3 1if n 1 print 輸入有誤 return 1 while n 2 0 a3 a1 a2 a1 a2 a2 a3 a 1return a3 result fab 20 if result 1 print 總共有 d對小兔子誕生 resu...
遞迴演算法斐波那契數列
有一對兔子,從出生後第3個月起,每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子。假如兔子都不死,求第n個月兔子對數 關於斐波那契數列的兔子繁殖問題其實如下 實際月份 123 4567 8幼仔對數 101 1235 8成兔對數 011 2358 13總體對數 112 35813 21幼仔對...