1. 程式人生 > >斐波那契數(JAVA實現)

斐波那契數(JAVA實現)

  1. public class Fibonacci {   
  2. /*輸出斐波那契數*/
  3. publicstaticvoid printFibonacciNumber(long f1,long f2,int n){//the first number, the second number,the totel fibonacci numbers 
  4. for(int i = 1;i <= n;i++){   
  5.             System.out.print(f1+" "+f2+" ");//先輸出前兩個數   
  6. if(i % 5 == 0)System.out.print("\n"); //換行  
  7.             f1 = f1+f2;   //計算下兩個數
  8.             f2 = f1+f2;   
  9.         }   
  10. /*後數除前數為黃金分割點*/
  11.         System.out.print("\n"+"-------------------------------------"+"\n");   
  12.         System.out.println((double)f2/f1);//越到後邊,後數除前數越接近黃金分割點 
  13.     }   
  14. /*輸出斐波那契陣列*/
  15. publicstaticvoid printFibonacciArray(long f1,long f2,int n){//the first number, the second number,the totel fibonacci numbers 
  16. long f[] = newlong[n];   
  17.         f[0]=f1;   
  18.         f[1]=f2;   
  19. for(int i =2;i <n;i++){ 
  20.             f[i]=f[i-2]+f[i-1]; //陣列的第三個數開始為前兩個數的和  
  21.         }   
  22.         System.out.println("-------------------------------------"+"\n");   
  23.         System.out.println(java.util.Arrays.toString(f)); //把陣列轉化成String輸出  
  24.     }   
  25. /**  
  26.      * main method  
  27.      * @param args  
  28.      */  
  29. publicstaticvoid main(String[] args) {   
  30.         Fibonacci.printFibonacciNumber(0110);//print the 20 advanced fibonacci number 
  31.         Fibonacci.printFibonacciArray(0120);   
  32.     }   
  33. }  

輸出結果:

0 1 1 2 3 5 8 13 21 34 
55 89 144 233 377 610 987 1597 2584 4181

-------------------------------------
1.6180339985218033
-------------------------------------

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]

小知識(摘錄):

    斐波那契是義大利的數學家。他是一個商人的兒子。兒童時代跟隨父親到了阿爾及利亞,在那裡學到了許多阿拉伯的算術和代數知識,從而對數學產生了濃厚的興趣。
  長大以後,因為商業貿易關係,他走遍了許多國家,到過埃及、敘利亞、希臘、西西里和法蘭西。每到一處他都留心蒐集數學知識。回國後,他把蒐集到的算術和代數材料,進行研究、整理,編寫成一本書,取名為《算盤之書》,於1202年正式出版。
  這本書是歐洲人從亞洲學來的算術和代數知識的整理和總結,它推動了歐洲數學的發展。其中有一道“兔子數目”的問題是這樣的:一個人到集市上買了一對小兔子,一個月後,這對小兔子長成一對大兔子。然後這對大兔子每過一個月就可以生一對小兔子,而每對小兔子也都是經過一個月可以長成大兔子,長成大兔後也是每經過一個月就可以生一對小兔子。那麼,從此人在市場上買回那對小兔子算起,每個月後,他擁有多少對小兔子和多少對大兔子?
  這是一個有趣的問題。當你將小兔子和大兔子的對數算出以後,你將發現這是一個很有規律的數列,而且這個數列與一些自然現象有關。人們為了紀念這位兔子問題的創始人,就把這個數列稱為“斐波那契數列”。

又找到了這麼一段話:

規律表:

月數 小兔 中兔 老兔 總數
 1    1    0    0    1
 2    0    1    0    1
 3    1    0    1    2
 4    1    1    1    3
 5    2    1    2    5
 6    3    2    3    8
 7    5    3    5   13

    在計算每一行時,大兔數為上月的大兔數加上月的中兔數,中兔數為上月的小兔數,小兔數為本月的大兔數,算總數為本月的小兔數加本月的中兔數加本月的大兔數。在觀察總數的過程中找出了規律:總數的第一、二月都是1,以後的每一月是前兩月的和。數列為1,1,2,3,5,8,13,21,34,55,……

    當n=50時,後項與前項的比是1.61803398874989,而前項與後項的比是0.61803398874989,即b/a的值與a/b的值相差1,假設後項與前項的比是φ,則有(φ-1)/φ=1,解這個方程得:φ= (√5+1) /2,這就是黃金分割。
    當n充分大時,斐波納契數列後前項的比值,與前後項的比值,相差1,它們的比值是黃金分割!黃金分割是一個十分有用的無理數。據此,把黃金分割可用一個有理數近似表示,如斐波納契數列的第七項與斐波納契數列的第六項的比13/8,斐波納契數列的第九項與斐波納契數列的第八項的比34/21等都可以近似地表示為黃金分割,當然項數越後越精確。