跳台階問題。
一個台階總共有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;}