面试题9:题目一:写一个函数,输入n,求斐波那契数列的第n项,斐波那契数列的定义如下:
0 n=0
f(n) = { 1 n=1
f(n-1)+f(n-2) n>1
第一放映这题用递归做只要5行代码就搞定了,稍微考虑发现如果写递归的代码估计就拿不到offer了,因为这是大一的时候几乎所有的入门的编程语言中都会给出的一个解法。
所以不能用递归,太浪费了,递归需要保存现场变量、堆栈信息等因此对于这么一个小程序来讲实际上是用大炮打蚊子。
考虑到递归之所以效率低的原因是没有保存中间的结果,所以采用如下的代码:
int Fibonacci(int i){
int []result;//用于保存中间结果
if(i == 0){
result[0] = 0;
return 0;
}else if(i == 1){
result[0] = 0;
return 1;
}else{
for(int j=2;j<=i;j++){
result[j] = result[j-1] + result[j-2];
}
return result[i];
}
}
虽然在算法没什么值得称赞的地方,但是确实是针对递归没用保存中间的计算结果而导致效率低下的一种合理的解决方案。