斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:

F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

记住这句话:

从第2项开始,每一项都等于前两项之和。(第0项是0,第一项是1)

 

下面用两种方式实现

1、递归

比如说想求解f(10),需要先求得f(9)和f(8),同理,想求得f(9),需要先求得f(8)和f(7)……

这是从上往下计算,会发现很多结点是重复的,随着n的增大,重复的结点数会急剧增加。时间复杂度很大

 

2、递推 (效率更高)

从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)……这种思路时间复杂度是O(n)

package offer_9;

import java.util.Scanner;

public class Fibonacci {  
      
    public static void main(String[] args) {  
        Scanner scanner = new Scanner(System.in);  
        System.out.println("Please input this fibonacci n:");  
        int n = scanner.nextInt(); // 假设输入为大于零的整数  
          
//        System.out.println(fibonacci(6) + ":" + fibonacciNormal(6));  
          
        int sum = 0;  
        for(int i = 1; i <= n; i++){  
            sum += fibonacci(i);  
        }  
        System.out.println(sum);  
    }  
      
    // 递归实现方式  
    public static int fibonacci(int n){  
        if(n <= 2){  
            return 1;  
        }else{  
            return fibonacci(n-1) + fibonacci(n-2);  
        }  
    }  
      
    // 递推实现方式  
    public static int fibonacciNormal(int n){  
        if(n <= 2){  
            return 1;  
        }  
        int n1 = 1, n2 = 1, sn = 0;  
        for(int i = 0; i < n - 2; i ++){  
            sn = n1 + n2;  
            n1 = n2;  
            n2 = sn;  
        }  
        return sn;  
    }  
}  

 比如:递归方式调用fibonacci(int n)

n=0时:不执行for循环,直接输出0

n=1时:for循环就执行一次,sum=0+fibonacci(1)=0+1=1

n=2时:for循环执行两次,最后sum=2

n=3时:for(int i = 1; i <= 3; i++)执行三次,最后sum=4

……

 posted on 2016-08-06 16:46  布鲁布鲁sky  阅读(273)  评论(0编辑  收藏  举报