斐波那契数列

 

第七题:斐波那契数列

 

题目描述

 

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

n<=39

 

解析:斐波那契数列也有叫它(不死神兔),就是数学规律题,递归版的写法很简单。

具体公式:F(n) = F(n-1) + F(n-2);

                  F(0) = 0;

                  F(1) = 1; 

 

面试官:写个斐波那契数列吧!(或者是给你一组数字,让你根据规律计算出第n项是多少......)

老王:非常迅速的写出了递归版本的代码,如下所示。

递归:

 public static int Solution(int n){  //递归解法
   
      if(n==1){  
          return 0;  
      }  
   
      if(n==2){  
          return 1;  
      }  
      return Solution(n-1)+Solution(n-2);  
  }  

面试官:看了看,表情凝重。很不满意,又问老王能不能优化一下?

如果此时老王不知道其他的写法,那么就可以出门左转不送了。。。。。

老王:既然递归不能满足你,那么我就加大一个力度吧,速度更快一点(手动狗头!!)

老王写出来了一个带有缓存每项结果的动态规划版本,如下所示:

缓存结果的写法:

 public class Solution {  //对结果进行缓存的写法
     public int Fibonacci(int n) {  
         if(n <= 1){  //代码的鲁棒性
             return n;  
         }
         //缓存所有的结果  
         int[] arr = new int[n+1];  
         arr[0] = 0;  
         arr[1] = 1;  
         for(int i = 2;i < n+1;i++){  
             arr[i] = arr[i-1] + arr[i-2];  
         }  
         return arr[n];  
     }  
 }  

面试官:看了看,脸上凝重的表情逐渐褪去,又说:你这样速度是可以了,但是有点浪费空间呀!能不能在优化一下呢?

老王:这样还不能满足你的话,那么我就在加大一个力度吧,省点空间(手动狗头!!)

老王写出来了一个只记录结果的动态规划版本,如下所示:

仅记录计算的结果:

 public class Solution {  //最优解
     public int Fibonacci(int n) {  
         if(n <= 1){  //代码的鲁棒性
             return n;  
         }  
         int first = 0;  
         int second = 1;
         //记录每一次的结果  
         int result = 0;  
         for(int i = 2;i < n+1;i++){  
             result = first + second;    
             first = second;    
             second = result;    
         }  
         return result;  
     }  
 }  

面试官:看了看,嘴角微微上扬,又说:不错,但是我这个人比较极端,我想能不能再快一点?

老王:内心中万马奔腾!!!!

老王:好吧看来得拿出我的杀手锏!大喊出:斐波那契兽进化(完美背景音乐~~)------------矩阵快速幂

老王与面试官的故事未完待续~~~~~~

 

NowCoder(Online Coding, Please Click)

 

 

你可能感兴趣的:(剑指offer)