# 斐波那契数列问题和扩展

CSDN：斐波那契数列问题和扩展

## 斐波那契数列介绍

F(0) = 0，F(1) = 1
F(n) = F(n - 1) + F(n - 2)，其中 n > 1

## 思路

### 暴力解法：递归版本

    public static int fib(int N) {
if (N <= 0) {
return 0;
}
if (N == 1 || N == 2) {
return 1;
}
return fib(N - 1) + fib(N - 2);
}


### 暴力解法：迭代版本

    public static int fib2(int N) {
if (N <= 0) {
return 0;
}
if (N == 1 || N == 2) {
return 1;
}
int first = 1;
int second = 1;
int result = 0;
for (int i = 3; i <= N; i++) {
result = first + second;
first = second;
second = result;
}
return result;
}



### 最优解

F(N) = C1 * F(N) + C2 * F(N-1) + ... + Ck * F(N-k) ( C1...Ck 和k都是常数)


F(N) = F(N - 1) + F(N - 2)


|F2,F3| * |a,b| = |F3,F4|
|c,d|


|F(N),F(N-1)|  = |F2,F1| * |0,1| ^ (N - 2)
|1,1|


public class LintCode_0428_PowXN {

// 类fabanacci问题
// pow X N   ( N 转成2进制）
// 复杂度 log（N）
public static double myPow(double x, int n) {
int pow = Math.abs(n == Integer.MIN_VALUE ? n + 1 : n);
double ans = 1D;
double t = x;
while (pow != 0) {
if ((pow & 1) != 0) {
ans *= t;
}
pow >>= 1;
t *= t;
}
if (n == Integer.MIN_VALUE) {
ans *= x;
}
if (n < 0) {
ans = 1D / ans;
}
return ans;
}
}


|1,0|
|0,1|


t 在斐波那契问题下初始为

|0,1|
|1,1|


    // 最优解 O(log^N)
public static int fib3(int N) {
if (N <= 0) {
return 0;
}
if (N == 1 || N == 2) {
return 1;
}
int[][] matrix = matrixPow(new int[][]{{0, 1}, {1, 1}}, N - 2);
return matrix[0][1] + matrix[1][1];
}

public static int[][] matrixPow(int[][] matrix, int n) {
int[][] ans = new int[][]{{1, 0}, {0, 1}};
int[][] t = matrix;
while (n != 0) {
if ((n & 1) != 0) {
ans = matrix(t, ans);
}
n >>= 1;
t = matrix(t, t);
}
return ans;
}

public static int[][] matrix(int[][] A, int[][] B) {
int[][] result = new int[2][2];
result[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0];
result[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1];
result[1][0] = A[1][0] * B[0][0] + A[1][1] * B[1][0];
result[1][1] = A[1][0] * B[0][1] + A[1][1] * B[1][1];
return result;
}


F(N) = 6 * F(N-1) + 3 * F(N-5)


|Fn,Fn-1,Fn-2,Fn-3,Fn-4| = |F5,F4,F3,F2,F1|x|5x5|^(N-5)


F(N) = A * F(N - 1) + .....+ E * F(N - i)


|Fn......Fn-(i-1)| = |Fi......F1|x|ixi|^(N-i)


01达标字符串的数量问题

## 参考资料

posted @ 2021-10-09 23:23  Grey Zeng  阅读(539)  评论(0编辑  收藏  举报