public class Fibonacci {
public static long F(int N) {
if (N == 0)
return 0;
if (N == 1)
return 1;
return F(N - 1) + F(N - 2);
}
private static long[][] keys = { { 1, 1 }, { 1, 0 } };
public static long F2(int N) {
long[][] res = calcuteNums(N);
return res[0][1];
}
private static long[][] calcuteNums(int n) {
if (n == 1) {
return keys;
} else {
if (n % 2 == 0) {
long[][] res = calcuteNums(n / 2);
return plus(res, res);
} else {
long[][] res = calcuteNums(n / 2);
return plus(res, plus(res, keys));
}
}
}
private static long[][] plus(long[][] nums1, long[][] nums2) {
long[][] res = new long[2][2];
res[0][0] = nums1[0][0] * nums2[0][0] + nums1[1][0] * nums2[1][0];
res[1][0] = nums1[1][0] * nums2[0][0] + nums1[1][1] * nums2[1][0];
res[0][1] = nums1[0][0] * nums2[0][1] + nums1[0][1] * nums2[1][1];
res[1][1] = nums1[1][0] * nums2[0][1] + nums1[1][1] * nums2[1][1];
return res;
}
public static void main(String[] args) {
System.out.println(F2(100));
// System.out.println(F(100));
}
}
计算斐波那契数列,两种方法,打开注释掉的语句你会感受到算法的力量
最新推荐文章于 2023-03-14 20:36:57 发布