斐波那契数列的定义为:
- F0 = 0
- F1 = 1
- Fn = Fn-1 + Fn-2 (n≥2)
即:斐波那契数列由0和1开始,之后的每一项均为之前的两数之和。
计算方法
递归法
unsigned long fibonacci(unsigned long n)
{
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
else
{
return fibonacci(n-1) + fibonacci(n-2)
}
}
迭代法
unsigned long fibonacci(unsigned long n)
{
unsigned long fib1 = 0, fib2 = 1;
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
else
{
while (n > 1)
{
unsigned long tmp = fib2;
fib2 = fib1 + fib2;
fib1 = tmp;
n--;
}
return fib2;
}
}
矩阵
矩阵的乘方可以用快速幂运算来做,时间复杂度为 O(log n)。
unsigned long fibonacci(unsigned long n)
{
register unsigned long pow[2][2] = { {1, 1}, {1, 0} };
register unsigned long fib[2][2] = { {1, 0}, {0, 1} };
while (n > 0)
{
register unsigned long tmp[2][2];
if (n & 1)
{
tmp[0][0] = fib[0][0];
tmp[0][1] = fib[0][1];
tmp[1][0] = fib[1][0];
tmp[1][1] = fib[1][1];
fib[0][0] = tmp[0][0] * pow[0][0] + tmp[0][1] * pow[1][0];
fib[0][1] = tmp[0][0] * pow[0][1] + tmp[0][1] * pow[1][1];
fib[1][0] = tmp[1][0] * pow[0][0] + tmp[1][1] * pow[1][0];
fib[1][1] = tmp[1][0] * pow[0][1] + tmp[1][1] * pow[1][1];
}
tmp[0][0] = pow[0][0];
tmp[0][1] = pow[0][1];
tmp[1][0] = pow[1][0];
tmp[1][1] = pow[1][1];
pow[0][0] = tmp[0][0] * tmp[0][0] + tmp[0][1] * tmp[1][0];
pow[0][1] = tmp[0][0] * tmp[0][1] + tmp[0][1] * tmp[1][1];
pow[1][0] = tmp[1][0] * tmp[0][0] + tmp[1][1] * tmp[1][0];
pow[1][1] = tmp[1][0] * tmp[0][1] + tmp[1][1] * tmp[1][1];
n >>= 1;
}
return fib[0][1];
}