题目:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义以下:面试
一、效率很低效的解法,挑剔的面试官不会喜欢函数
使用递归实现:spa
public class Fibonacci { public long getNum(int n){ if(n<=0){ return 0; }else if(n==1){ return 1; }else{ return getNum(n-1)+getNum(n-2); } } }
咱们不难发如今这颗树中有不少的节点是重复的,并且重复的节点数会随着n的增大而急剧增长,这意味着计算量会随着n的增大而急剧增大。事实上,用递归的方法计算的时间复杂度是以n的指数的方式递增的。读者不妨求Fibonacci的第100项试试,感觉一下这样的递归会慢到什么程度。code
二、面试官期待的适用解法:blog
其实改进的方法并不复杂,将计算出来的中间项保存起来,减小计算次数递归
public class Fibonacci2 { public long getNum(int n){ if(n==0){ return 0; } if(n==1){ return 1; } int temp1=0;//第n-2项的值 int temp2=1;//第n-1项的值 int result=0;//保存中间计算出来的结果 for(int i=2;i<=n;i++){ result=temp1+temp2; temp1=temp2; temp2=result; } return result; } }