转载请注明出处: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