题目一:写一个函数,输入n,求斐波那契数列的第n项,斐波那契数列的定义如下:
0 n = 0
f(n) = 1 n = 1
f(n - 1) + f(n - 2) n > 1
递归:
long long Fibonacci(unsigned int n)
{
if(n == 0 || n == 1)
return n;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
重复计算态度,面试官不会满意。
面试官期待的使用解法:
long long Fibonacci(unsigned int n)
{
if(n == 0 || n == 1)
return n;
int Fn_1 = 0;
int Fn_2 = 1;
int tmp;
for(int j = 2; j <= n; j++)
{
tmp = Fn_1 + Fn_2;
Fn_1 = Fn_2;
Fn_2 = tmp;
}
return tmp;
}
也可以借用数组:
long long Fibonacci(unsigned int n)
{
int result[n];
result[0] = 0;
result[1] = 1;
for(int i = 2; i <= n; i++)
{
result[i] = result[i - 1] + result[i - 2];
}
return result[n - 1];
}
题目二:一只青蛙一次可以跳1级台阶,也可以跳2级。求该青蛙跳上一个n级台阶总共多少种跳法。
通项公式:
1 n = 1;
2 n = 2;
f(2) + f(1) n = 3;
......
所以还是斐波那契数列
题目三:
我们可以用2 x 1的小矩形横着或者竖着去覆盖更大的矩形,请问用8个2 x 1的小矩形无重叠的覆盖一个2 x 8的大矩形,总共有多少种方法?
f(8)代表8个2 x 1的小矩形。。。。。。。。。
f(7)代表7个2 x 1的小矩形。。。。。。。。。
第一个小矩形有横着放和竖着放两种,所以:
f(8) = f(7) + f(6)
f(7) = f(6) + f(5)
......
f(2) = f(1) + f(0)
f(1) = 1
f(0) = 1;