面试题10:斐波那契数列
题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。
#include <iostream>
using namespace std;
// 方法一:递归解法,计算时间会随着n的增加急剧增大
long long Fibonacci1(unsigned int n) {
if(n<=0) return 0;
if(n==1) return 1;
return Fibonacci1(n-1) + Fibonacci1(n-2);
}
// 方法二:循环实现:利用变量保存中间结果,避免了不必要的重复计算
long long Fibonacci2(unsigned int n) {
int result[2] = {0, 1};
if(n < 2) {
return result[n];
}
long long fibNMinusOne = 0;
long long fibNMinusTwo = 1;
long long fibN = 0;
for(unsigned int i=2;i<=n;i++) {
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusOne = fibNMinusTwo;
fibNMinusTwo = fibN;
}
return fibN;
}
// 方法三:利用矩阵的乘方
int main() {
printf("%d", Fibonacci2(10));
return 0;
}
由斐波那契数列引出的应用题目:
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。
#include <iostream>
using namespace std;
long long frogAnalysis(unsigned int n){
int result[3] = {0, 1, 2};
if(n<=2) return result[n];
long long first = 1;
long long second = 2;
long long tmp = 0;
for(unsigned int i=3;i<=n;i++) {
tmp = first + second;
first = second;
second =tmp;
}
return tmp;
}
int main() {
printf("%d", frogAnalysis(4));
return 0;
}