跳台阶问题。
一个台阶总共有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 ) = 1
F( 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;
}