zoukankan      html  css  js  c++  java
  • 19.Fibonacci数列,输入n,用最快的方法求该数列的第n项

    转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4264326.html 

    声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明。谢谢。

    题目:定义Fibonacci数列如下, 输入n,用最快的方法求该数列的第n项。
               0   n=0
      f(n)={   1   n=1
            f(n-1)+f(n-2)    n>=2
    题目分析:
      此题用递归的方式求解是很方便的,但效率却不满足题意,下面给出三种思路。

    (一)、模拟对单链表的遍历,当n>=2,时,用一个变量pre保存i-2次的结果,p保存i-1此的结果,sum=pre+p为第n此的结果,一次运算完成后,pre和p都向后挪一位。

      算法实现:

     1     //非递归1
     2     private int fib1(int n){
     3         int sum=0;
     4         if(n==0){
     5             sum= 0;
     6         }
     7         else if(n==1){
     8             sum= 1;
     9         }
    10         else{ //pre保存第n-2次的结果,p保存第n-1次的结果
    11             int pre=0, p=1;
    12             while(n>=2){
    13                 sum = pre+p;
    14                 pre = p;
    15                 p = sum;
    16                 n--;
    17             }
    18         }
    19         return sum;
    20     }

    (二)、使用一个长度为2的数组来保存前两个结果,根据前两个结果得到本次结果,再在循环的过程中动态的修改数组的内容,这种方法比较巧。

      算法实现:

     1     //非递归
     2     private int fib(int n){
     3         int[] fib = {0,1};
     4         int sum=0;
     5         for(int i=2;i<=n;i++){
     6             sum = fib[0]+fib[1];
     7             fib[i%2] = sum;
     8         }
     9         return sum;
    10     }

    (三)、经典的递归实现

     1     //递归
     2     private int fib2(int n){
     3         if(n==0){
     4             return 0;
     5         }
     6         else if(n==1){
     7             return 1;
     8         }
     9         else
    10             return fib2(n-1)+fib2(n-2);
    11     }

    java 实现的完整源码:

     1 package com.interview;
     2 /**
     3  * Fibonacci数列,用最快的方法求该数列的第n项
     4  * @author wjh
     5  *
     6  */
     7 public class _19Fibonacci {
     8 
     9     /**
    10      * @param args
    11      */
    12     public static void main(String[] args) {
    13         _19Fibonacci invoker = new _19Fibonacci();
    14         int n = 20;
    15         System.out.println("1)这是非递归实现的结果:"+invoker.fib(n));
    16         System.out.println("2)这是非递归实现的结果1:"+invoker.fib1(n));
    17         System.out.println("3)这是递归实现的结果:"+invoker.fib2(n));
    18     }
    19 
    20     //非递归
    21     private int fib(int n){
    22         int[] fib = {0,1};
    23         int sum=0;
    24         for(int i=2;i<=n;i++){
    25             sum = fib[0]+fib[1];
    26             fib[i%2] = sum;
    27         }
    28         return sum;
    29     }
    30     
    31     //非递归1
    32     private int fib1(int n){
    33         int sum=0;
    34         if(n==0){
    35             sum= 0;
    36         }
    37         else if(n==1){
    38             sum= 1;
    39         }
    40         else{ //pre保存第n-2次的结果,p保存第n-1次的结果
    41             int pre=0, p=1;
    42             while(n>=2){
    43                 sum = pre+p;
    44                 pre = p;
    45                 p = sum;
    46                 n--;
    47             }
    48         }
    49         return sum;
    50     }
    51     
    52     
    53     //递归
    54     private int fib2(int n){
    55         if(n==0){
    56             return 0;
    57         }
    58         else if(n==1){
    59             return 1;
    60         }
    61         else
    62             return fib2(n-1)+fib2(n-2);
    63     }
    64     
    65 }
    展开

    运行结果:

    这是非递归实现的结果:6765
    这是非递归实现的结果1:6765
    这是递归实现的结果:6765

  • 相关阅读:
    JAVA类和对象
    JAVA数组
    JAVA流程控制语句
    JAVA运算符
    JAVA数据类型-整数、浮点、字符串、boolean、引用数据类型
    JAVA变量
    JAVA文档注释的三种方式
    @Transactional注解失效的场景总结
    接口幂等性
    事务的四个特性、四种隔离级别和七种传播行为
  • 原文地址:https://www.cnblogs.com/wuzetiandaren/p/4264326.html
Copyright © 2011-2022 走看看