From 剑指Offer 何海涛 著
#include <iostream> using namespace std; long long fibonacciRecursively(unsigned int n) { if(n <= 1) { return n; } return fibonacciRecursively(n-1) + fibonacciRecursively(n-2); } long long fibonacciIteratively(unsigned int n) { long long res = 0ll; long long one = 0ll; long long two = 1ll; if(n == 0) { return one; } if(n == 1) { return two; } for(unsigned int i=2; i<=n; i++) { res = one + two; one = two; two = res; } return res; } struct Matrix2By2 { Matrix2By2(long long m00 = 0ll, long long m01 = 0ll, long long m10 = 0ll, long long m11 = 0ll) : m_00(m00), m_01(m01), m_10(m10), m_11(m11) { } long long m_00 ; long long m_01 ; long long m_10 ; long long m_11 ; }; Matrix2By2 MatrixMultiply(const Matrix2By2& matrix1, const Matrix2By2& matrix2) { return Matrix2By2( matrix1.m_00 * matrix2.m_00 + matrix1.m_01 * matrix2.m_10, matrix1.m_00 * matrix2.m_01 + matrix1.m_01 * matrix2.m_11, matrix1.m_10 * matrix2.m_00 + matrix1.m_11 * matrix2.m_10, matrix1.m_10 * matrix2.m_01 + matrix1.m_11 * matrix2.m_11 ); }
Matrix2By2 MatrixPowerCore(unsigned int n) {
Matrix2By2 matrix;
if(n == 1) {
return Matrix2By2(1, 1, 1, 0);
}
matrix = MatrixPowerCore(n/2);
matrix = MatrixMultiply(matrix, matrix);
if(n % 2 != 0) {
matrix = MatrixMultiply(matrix, Matrix2By2(1, 1, 1, 0));
}
return matrix;
} Matrix2By2 MatrixPower(unsigned int n) { if(n == 0) { return Matrix2By2(); } if(n == 1) { return Matrix2By2(1, 1, 1, 0); }return MatrixPowerCore(n-1); }
测试集:
void test(unsigned int n, long long expected) { std::cout << std::boolalpha << (fibonacciRecursively(n) == expected) << std::endl; std::cout << std::boolalpha << (fibonacciIteratively(n) == expected) << std::endl; std::cout << std::boolalpha << (MatrixPower(n-1).m_00 == expected) << std::endl; } int main(int argc, char* argv[]) { test(0, 0ll); test(1, 1ll); test(2, 1ll); test(3, 2ll); test(4, 3ll); test(5, 5ll); test(6, 8ll); test(7, 13ll); test(8, 21ll); test(9, 34ll); test(10, 55ll); test(40, 102334155ll); return 0; }