斐波那契數列,即1、1、2、3、5......,從第三個數開始包括第三個數,都為這個數的前兩個數之和,而第一第二個數都為1。
下面是java輸出斐波那契數列的代碼:
import java.util.HashMap; public class Test{ //定義一個hashMap來存儲已經計算並且輸出過的值 public static HashMap<Integer, Integer> hashMap = new HashMap<Integer,Integer>(); //遞歸方法 public static int digui(int num) { //判斷這個值是否已存在,若存在則直接返回該值 if(hashMap.containsKey(num)) { return hashMap.get(num); } if(num<=2) { System.out.print(1+" "); hashMap.put(num, 1); return 1; } int sum = digui(num-1)+digui(num-2); System.out.print(sum+" "); hashMap.put(num, sum); return sum; } public static void main(String [] args){ digui(10); } }
輸出結果為:
1 1 2 3 5 8 13 21 34 55
這里最重要的是把已經計算過的值保存起來,再次遇到該值時直接返回,才不會重復計算,從而使得程序運行效率更高,也保證輸出結果不會重復。
其實斐波那契數列也可以不用遞歸來輸出,或者說遞歸的效率反而不高,只不過這個知識點一直是用來練習遞歸的,所以這里我也就采用遞歸來輸出,但是加了個緩存的HashMap,所以效率比一般的遞歸還是要快很多。
斐波那契數列別的輸出方式輸出代碼如下:
import java.util.HashMap; public class Test{ public static void print(int num) { //第一個數 int first = 1; //第二個數 int second = 1; //接收下一個數 int sum = 0; for(int i = 1;i<=num;i++) { if(i==1 || i==2) { System.out.print(1+" "); }else { sum = first + second; System.out.print(sum+" "); first = second; second = sum; } } } public static void main(String [] args){ print(10); } }
輸出結果如下:
1 1 2 3 5 8 13 21 34 55
第二種方法時間復雜度只有O(num),效率還是非常高的。斐波那契數列還有很多其他的輸出方式,這里只是講幾個實現的方法,就不一一列舉其他的了。