递归与分治——斐波那契数列非递归,递归,与优化后的递归算法
生活随笔
收集整理的這篇文章主要介紹了
递归与分治——斐波那契数列非递归,递归,与优化后的递归算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
斐波那契數列:
1、1、2、3、5、8、13、21、……
簡單說,就是前兩項的和是第三項的值。
1、求第N個斐波那契數的值(非遞歸)
//斐波那契數列 int fun(int n) {int a = 1, b = 1, c = 1;for (int i = 3; i <= n; i++){c = a + b;a = b;b = c;}return c; }//O(n) S(1)2、求第N個斐波那契數的值(遞歸)
很簡單,求第N個斐波那契數,我們需要求第n-1和n-2個斐波那契數,而求第n-1個斐波那契數,我們需要求第n-2和n-3個斐波那契數…以此類推,比如求第5個斐波那契數如圖:
遞歸出口很顯然,當n = 1或者2時,fib(n) = 1,所以遞歸出口便是n <= 2 return 1;
此遞歸算法時間復雜度為O(2^n) ,空間復雜度為S(n)。由上圖可見時間復雜度高是因為f(n)的值被多次計算,那怎么將遞歸的O(2^n)改成O(n)?
可見,當我們使f(n)只被計算一次,那么時間復雜度自然降為O(n)
3、優化后的斐波那契數列遞歸算法
尾遞歸法:通過兩個變量保存計算值,傳遞給下一次進行計算,遞歸的過程中也是根據n值變化逐步重復運算。
總結
以上是生活随笔為你收集整理的递归与分治——斐波那契数列非递归,递归,与优化后的递归算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应用服务器与数据库之间是长连接,要接收多
- 下一篇: 递归与分治——二分查找算法(折半查找算法