劍指Offer的學習筆記(C#篇)-- 斐波那契數列

題目:你們都知道斐波那契數列,如今要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。

一 . 理解概念

        斐波那契數列概念:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲「兔子數列」(來自百度百科)。具體可由如下公式表示:html

二.C#代碼如何實現

        由上述公式可知,斐波那契數列存在兩個特殊值,即當n=0和n=1時,所以,可將n等於0與1時提出來做單獨處理,而剩下的部分再做單獨處理,基於這種想法,實現該目標可以使用兩種方法:函數

方法1:遞歸法。

        斐波那契數列是遞歸法最典型的一種體現,但又存在着不少的不足。spa

        其中,遞歸的實現是經過調用函數自己,函數調用的時候,每次調用時要作地址保存,參數傳遞等,這是經過一個遞歸工做棧實現的。具體是每次調用函數自己要保存的內容包括:局部變量、形參、調用函數地址、返回值。那麼,若是遞歸調用 N 次,就要分配 N*局部變量、N*形參、N*調用函數地址、N*返回值,這勢必是影響效率的,該題目中,用遞歸方法計算的時間複雜度是以n的指數的方式遞增的,此段來自Edison Zhou的博文。code

        以下代碼是使用遞歸實現的斐波那契數列(該題目中能夠看出,若你>1,計算f(n)須要不斷從新的調用Fibonacci函數):htm

class Solution{
     public int Fibonacci(int n)
    {
        //當n小於等於0時,返回0
        if (n <= 0)
        {
            return 0;
        }
        //當n等於1時,返回1
        if (n == 1)
        {
            return 1;
        }
        //不然,返回前兩個數之和
        else
       {
             return Fibonacci(n - 1) + Fibonacci(n - 2);  
        } 
    }
}

 

        很顯然,遞歸雖然能夠實現斐波那契數列,但卻存在着必定的問題。blog

 方法二 : 循環法。

        因爲遞歸存在着效率低問題,爲解決該問題,引入循環的方法避免了遞歸法重複計算的弊端,從而運算的時間複雜度變爲是O(n)。遞歸

        具體實現代碼以下:ci

class Solution
{
    public int Fibonacci(int n)
    {
        // write code here
        int x = 0;
        int y = 1;
        int result = 0;
        if (n == 0)
        {
            return 0;
        }
        if (n == 1)
        {
            return 1;
        }
        else
        {
            for (int i=2;i<=n;i++)
        {
            result = x + y;
            x = y;
            y = result;
        }
            return result;
        }
    }
}

        上述代碼在實現上與遞歸法大同小異,不一樣點在於不須要重複的調用函數,我的感受理解起來更加容易一點。get

相關文章
相關標籤/搜索