编程之美2.9斐波那契数列

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Test;

import java.util.Scanner;

/**
 *
 * @author Administrator
 */
public class Fibonacci {

    
    static long arr[];
    private static void arrBuild(int n) {
        arr = new long[n+1];
        arr[0]=0;
        arr[1]=1;
    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        //解法一 根据斐波那契数列的公式递归求值,效率低
        long begin_1 = System.currentTimeMillis();
        int num1 = fibonacci1(n);
        long end_1 =System.currentTimeMillis();
        long l1 = end_1-begin_1;
        System.out.println("num1="+num1+"耗时:"+l1);
        //解法二 不用递归求
        long begin_2 = System.currentTimeMillis();
        long num2 = fibonacci2(n);
        long end_2 =System.currentTimeMillis();
        long l2 = end_2-begin_2;
        System.out.println("num2="+num2+"耗时:"+l2);
        //解法三  空间换时间,把已经算出来的值存在数组中
        arrBuild(n);
        long begin_3 = System.currentTimeMillis();
        long num3 = fibonacci3(n);
        long end_3 =System.currentTimeMillis();
        long l3 = end_3-begin_3;
        System.out.println("num3="+num3+"耗时:"+l3);
    }

    private static int fibonacci1(int n) {
       if(n ==0)
           return 0;
       if(n==1)
           return 1;
       else
           return fibonacci1(n-1)+fibonacci1(n-2);
    }
    private static long fibonacci2(int n) {
        if(n ==0)
            return 0;
        if(n ==1)
            return 1;
        long a =1;
        long b=0;
        while(n>=2){
            long tmp=a;
            a=a+b;
            b=tmp;
            n--;
        }
        return a;
    }
    private static long fibonacci3(int n) {
        
        if(arr[n]!=0||n==0)
            return arr[n];
        else
            arr[n]=fibonacci3(n-1)+fibonacci3(n-2);
        return arr[n];
    }
}
还没看懂分治法。。。。
也没懂2.8懂了补上。。。好伤心
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值