zoukankan      html  css  js  c++  java
  • 面试题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

    ……

  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/5744389.html
Copyright © 2011-2022 走看看