偶数斐波那契数(Java)

本题一共提供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);
    }

}

注:本文为个人学习笔记 如有侵权 一定会改

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值