斐波那契数列

题目一:写一个函数,输入n, 求斐波那契(Fibonacci)数列的第n项
斐波那契数 f(n):

f(n) = 0 (n=0);

f(n)=1(n=1);

f(n) = f(n-1)+f(n-2) (n>1)

解法1: C语言,递归

分析:这种方法虽然直观但是时间效率很低, 因为重复的计算过多,计算量会随着n的增大急剧增大, 时间复杂度以 n 的指数方式递增

long long Fibonacci (unsigned int n) {

    if (n<=0) return 0;

    if (n ==1) return 1;

    return Fibonacci(n-1)+Fibonacci(n-2);

}

解法2: 
从下往上计算,先根据 f(0) 和 f(1) 计算出 f(2), 再根据 f(1) 和 f(2) 算出 f(3) ..., 依此类推就可以算出第 n 项了。 这种思路的的时间复杂度是 O(n).

long long Fibonacci (unsigned n) {
    if (n == 0) return 0;
    if (n == 1) return 1;
    long long fibNMinusOne = 1;
    long long fibNMinusTwo = 0;
    for (unsigned int i =2; i<=n; ++i){
        fibN = fibNMinusOne + fibNMinusTwo;
        
        fibNMinusTwo = fibNMinusOne;
        fibNMinusOne = fibN;
    }

    return fibN;

}

 

题目二: 

一只青蛙一次可以跳上1级台阶,也可以跳上2级。 求该青蛙跳上一个 n 级的台阶总共有多少种跳法

解析:
首先考虑最简单的情况,如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳法了:一种是分两次跳,每次跳一级;另外一种是一次跳2级

把 n 级台阶时的跳法看成是 n 的函数,记为 f(n)。 当 n>2时,第一次跳的时候就有两种不同的选择:
一是第一次只跳1级,此时跳法数目等于后面剩下的 n-1级台阶的跳法数目,即为 f(n-1);
另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的 n-2级台阶的跳法数目,即为 f(n-2).
因此 n 级台阶的不同跳法的总数 f(n)=f(n-1)+f(n-2).
分析到这里,不难看出这实际上就是斐波那契数列了

题目2扩展:
在青蛙跳台阶的问题中,如果把条件改成: 一只青蛙一次可以跳上1级台阶,也可以跳上2级...它也可以跳上 n 级, 此时该青蛙跳上一个 n 级的台阶总共有多少种跳法?
用数学归纳法可以证明 f(n) = 2^n-1.

 

题目:

我们可以用2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用8个2*1的小矩形无重叠的覆盖一个2*8的大矩形,总共有多少种方法?

解析:
我们先把 2*8 的覆盖方法记为 f(8). 用第一个 1*2 小矩形去覆盖大矩形的最左边的时候有两个选择,竖着放或者横着放。
当竖着放的时候,右边还剩下 2*7 的区域,这种情形下的覆盖方法记为 f(7)
横着放,当 1*2 的小矩形横着放在左上角的时候,左下角必须横着放一个 1*2 的小矩形,而在右边还剩下 2*6 的区域, 这种情况下的覆盖方法记为 f(6).

因此 f(8) = f(7) + f(6). 此时可以看出,仍然是斐波那契数列

 

你可能感兴趣的:(斐波那契数列)