筆試面試題之Fibonacci數列

來源:互聯網
上載者:User

跳台階問題。

一個台階總共有n 級,如果一次可以跳1 級,也可以跳2 級。求總共有多少總跳法,並分析演算法的時間複雜度。

我們把n級台階時的跳法看成是n的函數,記為f(n)。當n>2時,第一次跳的時候就有兩種不同的選擇:一是第一次只跳1級,此時跳法數目等於後面剩下的n-1級台階的跳法數目,即為f(n-1);另外一種選擇是第一次跳2級,此時跳法數目等於後面剩下的n-2級台階的跳法數目,即為f(n-2)。因此n級台階時的不同跳法的總數f(n)=f(n-1)+(f-2)。

long long Fibonacci_Solution1(unsigned int n)  {      int result[2] = {0, 1};      if(n < 2)          return result[n];            return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);  }  
/*下面介紹一種時間複雜度是O(logn)的方法:對於斐波那契數列1,1,2,3,5,8,13…….有如下定義:F( n ) = F( n-1 ) + F( n-2 )F( 1 ) = 1F( 2 ) = 1矩陣形式:[ F( n+1 ) ,  F( n ) ] = [ F( n ) , F( n-1 ) ] * Q  其中 [ F( n+1 ) ,  F( n ) ]為行向量,Q = { [ 1, 1 ]; [ 1, 0 ] }為矩陣,則 [ F( n+1 ) , F( n ) ]=[ 1 , 0 ] * Qn , */ struct Matrix    {                 long long m_00, m_01, m_10, m_11;      Matrix ( long long m00 = 0,  long long m01 = 0,  long long m10 = 0,   long long m11 = 0 )           :m_00( m00 ), m_01( m01 ), m_10( m10 ), m_11( m11 )            {           }    }; Matrix MatrixMultiply (  const Matrix & m1, const Matrix & m2    )    {    long long m00 = m1.m_00 * m2.m_00 + m1.m_01 * m2.m_10;  long long m01 = m1.m_00 * m2.m_01 + m1.m_01 * m2.m_11;   long long m10 = m1.m_10 * m2.m_00 + m1.m_11 * m2.m_10      long long m11 = m1.m_10 * m2.m_01 + m1.m_11 * m2.m_11;       return Matrix ( m00,  m01,  m10, m11 );    }Matrix MatrixPower( unsigned int n )    {           assert(n > 0);           Matrix m;           if( n == 1)           {                 m = Matrix(1, 1, 1, 0);           }          else if(n % 2 == 0)           {                 m = MatrixPower( n / 2 );                 m = MatrixMultiply( matrix, matrix );           }          else if( n % 2 == 1 )           {                 m = MatrixPower( (n - 1) / 2 );                 m = MatrixMultiply( m, m );                 m = MatrixMultiply( m, Matrix( 1, 1, 1, 0 ) );           }           return m;    }  long long Fibonacci( unsigned int n ){      int result[2] = { 0, 1 };      if( n < 2 )            return result[ n ];      Matrix Q = MatrixPower( n - 1 );  //注意:按定義式應該用[ 1, 0 ]*Q, 或者等價於{ [ 1 , 0 ]; [ 0, 0 ] }*Q, 但是因為顯然結果相同,所以略去這一步。      return Q.m_00;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.