//斐波那契序列 求F(100)
public class Fibonacci {
//最简单的递归求斐波那契序列
public int fibonacci1(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fibonacci1(n - 1) + fibonacci1(n - 2);
}
}
//由底向上
public long fibonacci2(int n) {
//保存斐波那契序列
long fin[] = new long[n + 1];
fin[1] = 1;
fin[2] = 1;
for (int i = 3; i <= n; i++) {
fin[i] = fin[i - 2] + fin[i - 1];
}
return fin[n];
}
public long fibonacci21(int n) {
//只求最后一个
long a = 1;
long b = 1;
long c = 0;
for (int i = 3; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
//使用矩阵乘法
public long fibonacci3(int n) {
long fin[][] = {{1, 1}, {1, 0}};
long a[][] = {{1, 1}, {1, 0}};
long fin1[][] = {{1, 1}, {1, 0}};
long t;
for (int k = 1; k < n; k++) {//控制a矩阵的阶乘数
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
t = 0;
for (int z = 0; z < 2; z++) {
t = fin[i][z] * a[z][j] + t;
}
fin1[i][j] = t;
}
}
//计算出来的fin1还要复制给fin
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
fin[i][j] = fin1[i][j];
}
}
}
return fin[0][1];
}
public static void main(String[] args) {
Fibonacci fib = new Fibonacci();
//本来想测100的,天真了 45就3s时间,后面指数增长
long startTime = System.nanoTime(); // 获取开始时间
System.out.println(fib.fibonacci1(45));
long endTime = System.nanoTime(); // 获取结束时间
System.out.println("程序运行时间: " + (endTime - startTime) + "纳秒");
startTime = System.nanoTime(); // 获取开始时间
System.out.println(fib.fibonacci2(100));
endTime = System.nanoTime(); // 获取结束时间
System.out.println("程序运行时间: " + (endTime - startTime) + "纳秒");
//书上不是说用矩阵做效率是lgn吗?怎么做出来不一样
startTime = System.nanoTime(); // 获取开始时间
System.out.println(fib.fibonacci3(100));
endTime = System.nanoTime(); // 获取结束时间
System.out.println("程序运行时间: " + (endTime - startTime) + "纳秒");
startTime = System.nanoTime(); // 获取开始时间
System.out.println(fib.fibonacci21(100));
endTime = System.nanoTime(); // 获取结束时间
System.out.println("程序运行时间: " + (endTime - startTime) + "纳秒");
}
}
矩阵乘法的斐波那契
矩阵计算斐波那契序列可能有点问题,但网上找的答案都没有自底向上快不知道怎么回事?