斐波那契据数(JAVA实现)

斐波那契数(JAVA实现)
求Fibonacci数列的前20个数。该数列有如下特点: 第1, 2两个数为0,1。从第3个数开始,每个数等于前2个数之和。
生成方法为:
F1=1                  (n=1)
F2=1                  (n=2)
Fn=Fn-1+Fn-2           (n>=3)
java 代码
  1.   
  2. public class Fibonacci {   
  3.        
  4.     /*输出斐波那契数*/  
  5.     public static void printFibonacciNumber(long f1,long f2,int n){//the first number, the second number,the totel fibonacci numbers   
  6.         for(int i = 1;i <= n;i++){   
  7.             System.out.print(f1+" "+f2+" ");//先输出前两个数   
  8.             if(i % 5 == 0)System.out.print("\n"); //换行  
  9.             f1 = f1+f2;   //计算下两个数
  10.             f2 = f1+f2;   
  11.         }   
  12.            
  13.         /*后数除前数为黄金分割点*/  
  14.         System.out.print("\n"+"-------------------------------------"+"\n");   
  15.         System.out.println((double)f2/f1);//越到后边,后数除前数越接近黄金分割点   
  16.            
  17.            
  18.     }   
  19.        
  20.     /*输出斐波那契数组*/  
  21.     public static void printFibonacciArray(long f1,long f2,int n){//the first number, the second number,the totel fibonacci numbers   
  22.         long f[] = new long[n];   
  23.         f[0]=f1;   
  24.         f[1]=f2;   
  25.         for(int i =2;i <n;i++){ 
  26.             f[i]=f[i-2]+f[i-1]; //数组的第三个数开始为前两个数的和  
  27.         }   
  28.         System.out.println("-------------------------------------"+"\n");   
  29.         System.out.println(java.util.Arrays.toString(f)); //把数组转化成String输出  
  30.            
  31.     }   
  32.   
  33.     /**  
  34.      * main method  
  35.      * @param args  
  36.      */  
  37.     public static void main(String[] args) {   
  38.         Fibonacci.printFibonacciNumber(0110);//print the 20 advanced fibonacci number   
  39.         Fibonacci.printFibonacciArray(0120);   
  40.     }   
  41.   
  42. }  

输出结果:

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等都可以近似地表示为黄金分割,当然项数越后越精确。

1 楼 joyfun 2007-07-15  
后面的黄金分割可以用通解来解释
x^2=x+1 解出的解为数列通解 然后……

btw 第25行应该是
        for(int i =2;i<n;i++)  {
2 楼 xj4150 2007-07-16  
学C语言时做过这个题
3 楼 raykcn 2007-07-17  
不用这么麻烦吧.....

public class Fibonacci {
    public static long fib(int n) {
        if (n <= 1) return n;
        else return fib(n-1) + fib(n-2);
    }

    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        for (int i = 1; i <= N; i++)
            System.out.println(i + ": " + fib(i));
    }

}
4 楼 lordhong 2007-07-17  
引用
前20个数

为什么要用long来实现??
5 楼 lordhong 2007-07-18  
Groovy 试试:


start = 1
next = 1
20.times {
    print start + ' '
    newStart = next
    next = next + start
    start = newStart
}


结果:斐波那契据数(JAVA实现)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
Process finished with exit code 0

6 楼 kanokano 2007-07-18  
for(int i = 1;i <= n;i++){   
            System.out.print(f1+" "+f2+" ");//先输出前两个数   
            if(i % 5 == 0)System.out.print("\n"); //换行  
            f1 = f1+f2;   //计算下两个数
            f2 = f1+f2;   
        }   
  {  f1 = f1+f2;   //计算下两个数
            f2 = f1+f2;}     这样怎么看不懂啊?   
7 楼 tear12345 2007-07-18  
java 也做过,实际没有用上,不知道在那方面可以用的上,不会拿来考人或做练习吧
8 楼 抛出异常的爱 2007-07-18  
tear12345 写道
java 也做过,实际没有用上,不知道在那方面可以用的上,不会拿来考人或做练习吧
不知道你平时有没有用到过递归。。。。
写这种东西目的让人知道怎么用递归。
9 楼 tear12345 2007-08-01  
递归在java我很少用,我都是把递归转成循环来用
10 楼 realzhang 2007-09-06  
则有(φ-1)/φ=1,
不该有括号啊,楼主!
11 楼 anweixiao 2007-09-08  
讨论数学问题,我一般不会首先考虑使用java来实现的,这里给出一个matlab的实现:
clear
nf = 102;
tic
fibf(1) = 1;
fibf(2) = 1;
for n = 3:nf
    fibf(n) = fibf(n-1)+fibf(n-2);
end
ftimes(1) = toc;  % Collect tic-toc times.
>> fibf(1:10)

ans =

     1     1     2     3     5     8    13    21    34    55

作为一个很不错的数学工具,matlab是我接触到的最好的了。
12 楼 ccmoon 2007-09-13  
递归很慢,用的话你会被challenge
13 楼 万劫不复 2007-09-14  
我写的
import java.util.*;

public class Fibonacci{
long[] fibonacci(int N){//获得fibonacci数组方法
   long[] fi=new long[N];//临时存放数组
   fi[0]=1L;
   fi[1]=1L;
   for(int f=2;f<N;f++)
    fi[f]=fi[f-1]+fi[f-2];
   return fi;
}
public static void main(String[] args){
   Scanner sc=new Scanner(System.in);
   System.out.println("请输入你需要得到前多少位的fibonacci数:");
   int n=sc.nextInt();
   Fibonacci a=new Fibonacci();
   long[] fib=new long[n];
   fib=a.fibonacci(n);
   for(long s: fib)
    System.out.print(s+" ");
}
}
14 楼 lishubing_2000 2007-09-19  
兔子不死了?
15 楼 m_desire2010 2012-04-19  
非常清晰的思路!
支持楼主!