运算次数较少的 fibonacci 数列算法,可惜用了乘法
这是这样想的,fibonacci 数列也可以转换一下:
a b a+b (a+b)+b (a+b+b)+(a+b) ...
也就是说,后面的所有的数都可以用 a * m + b * n 来表示。
程序如下:
int
fib (int n)
{
if (n <= 2)
return 1;
static const int t[8][2] = {{1, 1}, {1, 2}, {2, 3}, {3, 5},
{5, 8}, {8, 13}, {13, 21}, {21, 34}};
int a = 1;
int b = 1;
int m = (n - 3) / 8;
while (m > 0)
{
int temp = a * t[6][0] + b * t[6][1];
b = a * t[7][0] + b * t[7][1];
a = temp;
m--;
}
m = (n - 3) % 8;
b = a * t[m][0] + b * t[m][1];
return b;
}