第七题:斐波那契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数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)