計算斐波那契數

計算斐波那契數html

【lintcode】366
描述
 查找斐波納契數列中第 N 個數。java

所謂的斐波納契數列是指:
  前2個數是 0 和 1 。
  第 i 個數是第 i-1 個數和第i-2 個數的和。
斐波納契數列的前10個數字是:
  0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...算法


如下是用java代碼解決的幾種方式實現code

package com.recursive;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/**
 * 計算斐波那契數
 * 數列:0 1 1 2 3 5 8 13 21 34  55 89。。。。。
 * 下標:0 1 2 3 4 5 6 7  8   9  10 11.。。。。
 * 下標:1 2 3 4 5 6 7 8  9  10  11 12
 * <p>
 * fib(0) = 0
 * fib(1) = 1
 * fib(n) = fib(n-2) + fib(n-1) n>=2
 */
public class ComputerFibonacci {

    public static void main(String[] args) {
        int n = 44;
//        Scanner input = new Scanner(System.in);
//        System.out.println("請輸入要計算的斐波那契數的下標值(從0開始):");
//        int n = input.nextInt();

        long startTime = System.currentTimeMillis();
        System.out.println("遞歸方法輸入的斐波那契數的下標值: " + n + ",對應的斐波那契數爲 : " + fibonacciRecursive(n));
        long endTime = System.currentTimeMillis();
        long time = endTime - startTime;
        System.out.println("程序運行時間:" + time / 60 + "s");

        long startTime2 = System.currentTimeMillis();
        System.out.println("迭代方法輸入的斐波那契數的下標值: " + n + ",對應的斐波那契數爲 : " + fibonacciIteration(n));
        long endTime2 = System.currentTimeMillis();
        long time2 = endTime2 - startTime2;
        System.out.println("程序運行時間:" + time2 / 60 + "s");

        long startTime3 = System.currentTimeMillis();
        System.out.println("for循環方法輸入的斐波那契數的下標值: " + n + ",對應的斐波那契數爲 : " + fibonacciFor(n));
        long endTime3 = System.currentTimeMillis();
        long time3 = endTime3 - startTime3;
        System.out.println("程序運行時間:" + time3 / 60 + "s");

        long startTime4 = System.currentTimeMillis();
        System.out.println("尾遞歸方法輸入的斐波那契數的下標值: " + n + ",對應的斐波那契數爲 : " + fibonacciRecursive2(n));
        long endTime4 = System.currentTimeMillis();
        long time4 = endTime4 - startTime4;
        System.out.println("程序運行時間:" + time4 / 60 + "s");
    }

    /**
     * 使用遞歸
     *
     * @param n
     * @return
     */
    public static int fibonacciRecursive(int n) {
        if (n == 1) {
            return 0;
        } else if (n == 2) {
            return 1;
        } else {
            return fibonacciRecursive(n - 2) + fibonacciRecursive(n - 1);
        }

    }

    /**
     * 迭代 for
     * @param n
     * @return
     */
    public static int fibonacciIteration(int n) {
        int f0 = 0,f1 = 1,currentFib = 0;
        if(n == 1) {
            return 0;
        }
        if (n == 2) {
            return 1;
        }

        for (int i = 3; i <= n; i++) {
            currentFib = f0 + f1;
            f0 = f1;
            f1 = currentFib;
        }
        return currentFib;
    }

    /**
     * for循環
     *
     * @param n
     * @return
     */
    public static  int fibonacciFor(int n) {
        int a = 0;
        int b = 1;
        int c = 0;

        int ni = Integer.valueOf(n).toString().length();

        if (n == 1) {
            c = 0;
        } else if (n == 2) {
            c = 1;
        } else if (n >= 3 && ni <= 32) {
            for (int i = 3; i <= n; i++) {
                c = a + b;
                a = b;
                b = c;
            }
        }
        return c;
    }

    /**
     * 尾遞歸
     * @param n
     * @return
     */
    public static int fibonacciRecursive2(int n){
        return fib(n,0,1);
    }
    private static int fib(int n, int a, int b){
        if(n==1) {
            return a;
        }
        if(n==2) {
            return b;
        }
        return fib(n-1,b,a+b);

    }
}

計算結果:
在這裏插入圖片描述orm

遞歸算法參考:htm

http://www.javashuo.com/article/p-vqismovq-vd.htmlblog

相關文章
相關標籤/搜索