今天看《劍指offer》看到了斐波那契數列其實用遞迴呼叫樹的話會有很多重複計算......(之前自己就是一直圖省事,感覺寫的**少,用遞迴很方便,但是仔細一想的確是有很多計算是重複的,浪費了很多時間所以今天的隨筆就說一下斐波那契的順序實現吧
int fibonacci(int num)
以前的我一直是用遞迴寫的,因為可以看到,真的很方便(這裡寫的簡單了,沒有考慮負數和異常輸入之類的,自己編寫時還是要多加考慮邊界條件和異常輸入啦~)
我們可以看出比如num = 4時 要算num = 3時的值 + num = 2的值,而num = 3時又要算一遍num = 2的值,就很累贅。所以用順序結構從1到n這樣的話,就能少掉這個麻煩。
第一種方法是用兩個數不斷變換,最終得到目標值
/*順序斐波那契額*/
#includeint fibonacci(int n)
return tmp;
}int main()
q.pop();
int result = q.front();
q.pop();
return result;
}int main()
{ int n;
while(std::cin>>n)
{ std::cout<<"fnums is :"《當然還有一種方法是陣列實現啦我覺得用的空間會大於第一種方式,而且原理也並沒什麼差別在此就不寫啦
總之呢,遞迴雖然**量少,(可是**量少並不是決定乙個程式設計師的強弱啊喂!)但是重複計算過程有點點多,然後可憐的棧也會出現stack overflow(棧溢位)的錯誤,所以還是順序比較好嘛隨著n的增大,順序的優勢也會更加明顯的
在《劍指offer》上還說了需要知識遷移的能力,提到了乙隻青蛙一次可以跳上1級台階,也可以跳上兩級台階,問青蛙跳上n級台階總共有幾種跳法的問題.
這類問題可以這樣想,1級台階有1種,2級台階有兩種,我們可以知道上3級台階前,青蛙一定是站在n-2(1)級台階或者上n-1(2)級台階,所以就是把f(n-2)+f(n-1)加在一起就是上n級台階的跳法總數啦,沒錯,就是你!斐波那契數列!
和這個思維很像的還有漢諾塔問題,要把柱子a的n個圓盤放到c,也就是把柱子a的n-1個圓盤放到b,然後再把第n個圓盤放在c,最後把b柱子通過a放到c,也就是2*f(n-1)+1
遞迴實現斐波那契數列
斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n package com.algorithm.tiger.recursion 遞迴和非遞迴方法實現斐波那契數列 斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n descripti...
斐波那契數列遞迴實現
什麼是fibnacci數列?斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家萊昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 34 在數學上與 分割的關係 ...
斐波那契數列遞迴實現
1.斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家萊昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 55 89 斐波納契數列在現代物理 準晶體結構 化學...