公式:F(n) = F(n-1) + F(n-2)
假设第一个数是0,第二个数是1
1.迭代加法:
long long fabonacci_first(int n) {
long long a = 0, b = 1;
if (n == 1) return a;
else if (n == 2) return b;
else {
for (int i = 3; i <= n; i++) {
b = a + b;
a = b - a;
}
return b;
}
}
2.利用数组先存储数字,直接返回结果,耗费空间:
long long fabonacci_second(int n) {
long long arr[50];
arr[1] = 0; arr[2] = 1;
for (int i = 3; i < 100; i++)
arr[i] = arr[i-1] + arr[i-2];
return arr[n];
}
3.二分递归,由于每次都需要重新计算,损耗大量时间和空间,时间复杂度O(2^n):
long long fabonacci_third(int n) {
if (n == 1) return 0;
else if (n == 2) return 1;
else return fabonacci_second(n-1) + fabonacci_second(n-2);
}
4.尾递归:
long long fabonacci_fourth(long long first, long long second, int n) { //传入时first = 0,second = 1
if (n == 1) return first;
else if (n == 2) return second;
else if (n == 3) return first + second;
else return fabonacci_fourth(second, first + second, n - 1);
}
5.备忘录法,使用递归方法,但利用数组来存储来避免重复计算子问题:
long long arr[100];
long long fibonacci_fifth(int n) {
if (arr[n] > 0) return arr[n];
if (n == 1) return 0;
if (n == 2) return 1;
arr[n] = fibonacci_fifth(n-1) + fibonacci_fifth(n-2);
return arr[n];
}