本题一共提供5种解法:
1.利用递归求斐波那契数 再逐一判断
2.利用数组存储结构 优化方法1
3.利用变量交替原理
4.滚动数组 (优化3在一个数为2个数的和 如果3个呢 4个呢)
5.基于本题的特殊解法
package edu.wust;
//不超过400万的斐波拉契树偶数和
public class work002 {
/**
* 方法1 用递归方法 递归4百万内所以的斐波那契数
*一种递归求斐波拉斯树的方法【时间复杂度很高 了解即可】
*/
public static int fib(int i){
if(i==1)return 1;
if(i==2)return 2;
else return fib(i-1)+fib(i-2);
}
/**
* 方法2 利用数组的存储结构
*下面的思路是遍历4百万内所以的斐波那契数 是偶数则加
* 时间复杂度:O( n )
* 空间复杂度:O( n )
*/
public static void main(String[] args) {
var sum=0;
int a[]=new int[10000];
a[0]=1;a[1]=2;
for(var i=2;i<10000;i++){
a[i]=a[i-1]+a[i-2];
if(a[i]>4000000)break;
if(a[i]%2==0){
sum+=a[i];
}
}
System.out.println(sum+2);
}
/**
* 方法3 变量交替
* 思路:个人感觉a,b有点像指针 a,b不停的往前面移动 遍历所有数 但靠a存储i-2,b存储i-1
* 时间复杂度:O( n )
* 空间复杂度:O( 1 )
*/
public static void fun3(){
int sum=0;
int a=1,b=2;
while (b<=4000000){
if(b%2==0){
sum+=b;
}
int tap=b;
b=a+b;
a=tap;
}
System.out.println(sum);
}
/**
* 方法4 滚动数组
* 变量交替的方式极大程度的优化了空间复杂度,但有一个致命缺陷
* 需要手动命名很多变量来赋值,在递推公式仅由前两项决定的情况下不是很明显,可如果是由前4项决定的时候呢
*PS:遇到减法后取模一定要判断是否为负数,如果为负可以在取模前加一个模数
* 时间复杂度:O( n )
* 空间复杂度:O( 1 )
*/
public static void fun4(){
int []a=new int[3];
a[0]=1;a[1]=2;
int i=2;
int sum=0;
while (true){
a[i%3]=a[(i-1+3)%3]+a[(i-2+3)%3];//本题其实可以不加3 因为在本题的范围内 一定为正
if(a[i%3]>4000000)break;
if(a[i%3]%2==0)sum+=a[i%3];
i++;
}
}
/**
* 方法5 利用3个斐波那契数为周期 第1,3总为奇数,第2总为偶数规律求解【非常规方法 了解】
*/
public static void fun5() {
int a=1,b=2,c=a+b,sum=0;
int m=4000000;
sum+=b;
while(2*c+b<=m)
{
a=b+c;b=c+a;c=a+b;sum+=b;
};
System.out.print(sum);
}
}
注:本文为个人学习笔记 如有侵权 一定会改