計算斐波那契數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