面试题9、斐波拉契数列
题目:
输入整数n,求斐波拉契数列第n个数。
思路:
一、递归式算法:
利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下:
代码:
long long Fib(unsigned int n)
{
if(n<=0)
return 0;
if(n==1)
return 1;
return Fib(n-1) + Fib(n-2);
}
缺陷:
当n比较大时递归非常慢,因为递归过程中存在很多重复计算。
二、改进思路:
应该采用非递归算法,保存之前的计算结果,用空间换时间。
代码如下:
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int num1 = 0;
int num2 = 1;
for(int i=2;i<n;i++)
{
int tmp = num1 + num2;
num1 = num2;
num2 = tmp;
}
printf("%d", num2);
}
相似题目:
1、青蛙跳台阶,一次可以跳1或者2格,共n阶台阶,问有多少种上台阶的方法?
思路:从后往前想,f(n) = f(n-1) + f(n-2),转换成同样的题目了。
2、矩形覆盖问题,用21的矩形来覆盖28的矩形,小矩形可以横着或竖着来覆盖,问有多少种方法去覆盖?
思路:横着覆盖就变成了f(8) = 1+f(8-2),竖着变成f(8) = 1 + f(8-1),所以f(8) = f(8-1) + f(8-2)。