• 面试题9:斐波那契数列


    斐波那契数列,又称黄金分割数列,指的是这样一个数列: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

    ……

  • 相关阅读:
    一张图理解prototype、proto和constructor的三角关系
    深入理解javascript对象系列第三篇——神秘的属性描述符
    深入理解javascript对象系列第二篇——属性操作
    深入理解javascript对象系列第一篇——初识对象
    javascript类型系统——Math对象
    Django的第一个页面
    关于原型链
    js中的继承问题
    面向对象关于函数以及this的问题
    关于bind、call以及apply
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/5744389.html
Copyright © 2020-2023  润新知