• 剑指offer【07】- 斐波那契数列(java)


    题目:斐波那契数列

    考点:递归和循环

    题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39。

    法一:递归法,不过递归比较慢,会超时,所以不考虑

    举个小点的例子,n=4,看看程序怎么跑的:
     
     
    Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
                        = Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
                        = Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
     
    由于我们的代码并没有记录Fibonacci(1)和Fibonacci(0)的结果,对于程序来说它每次递归都是未知的,因此光是n=4时f(1)就重复计算了3次之多。
    1 public class Solution {
    2     public int Fibonacci(int n) {
    3         if(n <= 1){
    4             return n;
    5         }else{
    6             return Fibonacci(n-1)+Fibonacci(n-2);
    7         }
    8     }
    9 }

    递归法运行时间:1200ms

    法二:利用循环

     1 public class Solution {
     2     //求斐波那契数列的前n项和
     3     public int Fibonacci(int n) {
     4         if(n == 0){
     5             return 0;
     6         }
     7         if(n == 1 || n == 2){
     8             return 1;
     9         }
    10         int one = 1;
    11         int two = 1;
    12         int sum = 0;
    13         for(int i = 2; i < n; i++){
    14             sum = one + two;
    15             one = two;
    16             two = sum;
    17         }
    18         return sum;
    19     }
    20 }

    循环法运行时间:21ms

    法三:动态规划法

     1 public class Solution {
     2     //求斐波那契数列的前n项和
     3     public int Fibonacci(int n) {
     4         //动态规划法
     5         if(n == 0) return 0;
     6         int one = 1;
     7         int two = 1;
     8         while(n-- > 2){
     9             two = two + one;
    10             one = two - one;
    11         }
    12         return two;
    13     }
    14 }

    动态规划法运行时间:13ms

  • 相关阅读:
    APPlication,Session和Cookie的区别
    C# 中的Request对象的应用
    从字符串里提取一个列表(数组)
    UDP:用户数据报协议
    反射
    网络编程
    多线程
    final,finally和finalize的区别
    集合
    StringBuffer
  • 原文地址:https://www.cnblogs.com/linliquan/p/10591096.html
Copyright © 2020-2023  润新知