斐波那契数列1 1 2 3 5 8递归以及算法优化

最后附有全代码

建一个测试类

> public class Digui {
>     //声明静态变量缓存方法优化使用
>     private static int[] ache;
>     
>     public static void main(String[] args) {
>                     ache=new int[46];
>         for (int i = 0; i < 46; i++) {
>             long date=System.currentTimeMillis(); //            System.out.println(i+"的结果是"+digui(i)+"的时间是"+(System.currentTimeMillis()-date));
> //           
> System.out.println(i+"的结果是"+noDiGui(i)+"的时间是"+(System.currentTimeMillis()-date));
> //           
> System.out.println(i+"的结果是"+diGuiAche(i)+"的时间是"+(System.currentTimeMillis()-date));
> //           
> System.out.println(i+"的结果是"+weiDiGui(i,1,1)+"的时间是"+(System.currentTimeMillis()-date));
>         }
>     }
> }

最原始的方法

/**
     * 递归 时间复杂度是2^n  空间负责度2^n n=45的时候运行时间为2.4s左右
     * @param a
     * @return
     */
    static int digui(int a){
        if(a<=2){
            return 1;}
        return digui(a-1)+digui(a-2);
    }

使用非递归

// 使用非递归
    static int noDiGui(int n){
        if(n<=2){return 1;}
        int m=1;
        int p=1;
        int res=0;
        for (int i = 2; i < n; i++) {
            res=p+m;
            m=p;
            p=res;
        }
        return res;
    }

使用缓存

 //使用缓存
    static int diGuiAche(int n){
        if(n<=2){
            return 1;}
        int res=0;
        if(ache[n]>0){
            return ache[n];
        }
        res=diGuiAche(n-1)+diGuiAche(n-2);
        ache[n]=res;
        return res;
    }

尾递归 (有点好玩)


//尾递归
    static  int weiDiGui(int n,int last,int lastLast){
        if(n<=2){
            return lastLast;
        }
        return weiDiGui(n-1,lastLast,last+lastLast);
    }

全代码

package com.testList;

import org.apache.commons.codec.language.bm.Lang;

import java.util.Date;

public class Digui {
    //声明静态变量缓存方法优化使用
    private static int[] ache;

    public static void main(String[] args) {
                    ache=new int[46];
        for (int i = 0; i < 46; i++) {
            long date=System.currentTimeMillis();
//            System.out.println(i+"的结果是"+digui(i)+"的时间是"+(System.currentTimeMillis()-date));
//            System.out.println(i+"的结果是"+noDiGui(i)+"的时间是"+(System.currentTimeMillis()-date));
//            System.out.println(i+"的结果是"+diGuiAche(i)+"的时间是"+(System.currentTimeMillis()-date));
//            System.out.println(i+"的结果是"+weiDiGui(i,1,1)+"的时间是"+(System.currentTimeMillis()-date));
        }
    }

    /**
     * 递归 时间复杂度是2^n  空间负责度2^n n=45的时候运行时间为2.4s左右
     * @param a
     * @return
     */
    static int digui(int a){
        if(a<=2){
            return 1;}
        return digui(a-1)+digui(a-2);
    }

    // 使用非递归
    static int noDiGui(int n){
        if(n<=2){return 1;}
        int m=1;
        int p=1;
        int res=0;
        for (int i = 2; i < n; i++) {
            res=p+m;
            m=p;
            p=res;
        }
        return res;
    }
    //使用缓存
    static int diGuiAche(int n){
        if(n<=2){
            return 1;}
        int res=0;
        if(ache[n]>0){
            return ache[n];
        }
        res=diGuiAche(n-1)+diGuiAche(n-2);
        ache[n]=res;
        return res;
    }
    //尾递归
    static  int weiDiGui(int n,int last,int lastLast){
        if(n<=2){
            return lastLast;
        }
        return weiDiGui(n-1,lastLast,last+lastLast);
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值