一.题目:
写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契(Fibonacci)数列定义如下:
二.分析:
有三种解题方法:
1.基于递归的解法虽然直观,但时间效率很低,实际软件开发中不会用这种方法,也不可能得到面试官的青睐。
2.把递归的算法用循环实现,提高时间效率。
3.把求斐波那契数列转换成求矩阵的乘方,有创意,但不实用。
三.答案:
1.递归方法:
long long fibonacci(unsigned int n) {
if (n <= 0) {
return 0;
}
if (n == 1) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
2.迭代(循环)方法:
long long fibonacci(unsigned int n) {
int result[2] = {0, 1};
if (n < 2) {
return result[n];
}
long long fibNMinusOne = 1;
long long fibNMinusTwo = 0;
long long fibN = 0;
for (unsigned int i = 2; i < n; i++) {
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
四.相关题目:
1.青蛙跳台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级台阶总共有多少种跳法。
2.我们可以用2*1的小矩阵横着或者竖着去覆盖更大的矩形。请问用8个2*1的小矩形无重叠地覆盖一个2*8的大矩形,总共有多少种方法?