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

 

posted @ 2015-01-31 19:53  武则天大人  阅读(502)  评论(0编辑  收藏  举报