思路1:简单循环
int fib(int n) {
if (n == 1) {
return 1;
}
if (n <= 0) {
return 0;
}
// 用a和b 代替 f(0)和 f(1)
int a = 0, b = 1;
int res = 0;
for (int i = 2;i <= n; i++) {
res = a + b;
a = b;
b = res;
}
return res;
}
思路2:快速幂
//矩阵相乘
vector<vector<int> > multi(vector<vector<int> > a, vector<vector<int> > b) {
vector<vector<int> > res(a.size(), vector<int>(a.size(), 0));
res[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0];
res[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1];
res[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0];
res[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1];
return res;
}
int fib(int n) {
//输入:[F1,F0][1,1] = [F2, F1]
// [1,0]
vector<vector<int> > a(2, vector<int>(2, 0));
a[0][0] = 1;
a[1][0] = 1;
a[0][1] = 1;
if (n == 1 || n == 2) {
return 1;
}
if (n <= 0) {
return 0;
}
vector<vector<int> > res(2, vector<int>(2, 0));
res[0][0] = 1;
res[1][0] = 1;
res[0][1] = 1;
//快速幂,为什么-2(res就是本身转化矩阵)
n = n - 2;
while (n) {
if (n % 2) {
res = multi(res, a);
}
n = n / 2;
a = multi(a, a);
}
return res[0][0];
}