【求職面試】斐波那契數列(C#版)

來源:互聯網
上載者:User

經典就是經典,不論多少年,經典永遠不會改變。

語言,架構總有一天會過時,但是唯獨經典永遠存在。這就是研究這些經典演算法的永恒。

當我這樣一個.net程式員去應聘Java, C++, Android崗位時,我發現架構語言特性,都被拋棄。就這樣海綿一擠,我的4年水分就出來了。剩下的精華已不多。而能貫穿各個崗位的,就是這些雖在身邊,但卻忽視如空氣般的,底層知識和應用能力。

你的經驗,有多少水分呢?在一個公司久了,出來晒晒,你就發現,其實你會的並不多。

 

有趣問題:

1,有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?

答:這就是一個斐波那契數列:登上第一級台階有一種登法;登上兩級台階,有一種登法;登上三級台階,有兩種登法;登上四級台階,有三種方法……所以,1, 1,2,3,5,8,13……登上十級,有89種。

2,數列中相鄰兩項的前項比後項的極限是多少,就是問,當n趨於無窮大時,F(n)/F(n+1)的極限是多少?

答:這個可由它的通項公式直接得到,極限是(-1+√5)/2,這個就是所謂的黃金分割點,也是代表大自然的和諧的一個數字。

 

數學表示:

Fibonacci數列的數學運算式就是:

F(n) = F(n-1) + F(n-2)

F(1) = 1

                                  F(2) = 1

 

公式是給出來了,可是為什麼是這個公式呢?你有沒有想過?

公式是怎麼提煉出來的?我數學不好,所以我的經驗就是從找規律開始:

  如果起點是0的話,對於第一級台階來講有F(1)=1種走法,對於第二級來講有F(2)=1種走法。對於第三極台階,有1+2, 2+1兩種走法。對於第四級台階,可以從第三極台階+1,也可以從第二級台階+2,也就是F(4) = F(3) + F(2),以此類推。

 寫代碼也很簡單:

        ///<summary>
/// Fibonacci遞迴演算法。時間複雜度O(n)=O((3/2)^n),指數級演算法
///</summary>
public ulong FibonacciRecursion(int n)
{
if (n < 0)
throw new ArgumentOutOfRangeException("n must > 0.");

if (n == 1 || n == 2)
return 1;
return FibonacciRecursion(n - 1) + FibonacciRecursion(n - 2);
}

那麼這個超級簡單的遞推程式,效率是多少呢?讓我們加個數組,記錄每次遞迴的次數,同時可以output一下,看看這些有趣的數字。

        ///<summary>
/// 遞迴輸出Fibonacci
///</summary>
public ulong FibonacciRecursionCount(int n, int[] countArray)
{
countArray[n]++; //count the compute number.

if (n < 0)
throw new ArgumentOutOfRangeException("n must > 0.");

if (n == 1 || n == 2)
return 1;
return FibonacciRecursionCount(n - 1, countArray) + FibonacciRecursionCount(n - 2, countArray);
}

這時,可以得到每個fib(i)被計算的次數:

fib(10) = 1     fib(9) = 1      fib(8) = 2      fib(7) = 3

fib(6) = 5      fib(5) = 8      fib(4) = 13    fib(3) = 21

fib(2) = 34   fib(1) = 55    fib(0) = 34

可見,計算次數呈反向的Fibonacci數列,這顯然造成了大量重複計算。

我們令T(N)為函數fib(n)的已耗用時間,當N>=2的時候我們分析可知:

T(N) = T(N-1) + T(N-2) + 2

而fib(n) = fib(n-1) + fib(n-2),所以有T(N) >= fib(n),歸納法證明可得:

fib(N) < (5/3)^N

N>4時,fibN>= (3/2)^N

標準寫法:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.