在C语言或者C++的面试中,斐波那契数列是个比较常见的题目
常见的解法 是递归
long FBNQ_DG(unsigned long n)
{
return n <= 2?1:(PBNQ_DG(n-1)+PBNQ_DG(n-2));
}
然后面试官会让你考虑一种新的方法去写
另一种解法是循环
long FBNQ_FDG(unsigned long n)
{
long result;
if (n <= 2)
{
return 1;
}
int last1 = 1,last2 = 1;
for (int i = 0;i < n-2;i++)
{
result = last2 + last1;
last2 = last1;
last1 = result;
}
return result;
}接下来,面试官会让你比较这两种方法的效率
一般的回答是,循环的效率更高,递归会导致多次进行重复的计算。举个例子:
f(7) = f(6) + f(5) = f(5) + f(4) + f(4)+ f(3) = f(4) + f(3) + f(3) + f(2) + f(3) + f(2) + f(2) +f(1)
写道这里就不难发现f(2),f(3)计算了多次,而循环采用中间变量保存上一次计算结果,所以效率较高
这里面试官可能还会问你这样写会不会有什么问题
接下来就要考虑类型溢出的问题,因为不管是int 还是long,都是有取值范围的,如果数值过大会导致溢出。
关于大数的问题,本文不做详细解释,想要知道的同学自行搜索
239

被折叠的 条评论
为什么被折叠?



