剑指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

posted @ 2019-03-24 22:43  [浪子回头]  阅读(363)  评论(0编辑  收藏  举报