斐波拉切数列--实例

一、矩形覆盖:
1.题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?
斐波拉切数列--实例
2.解题思路
解法一:排列组合,假设竖方块的数量是y,横方块的数量是x,可知x+2
y=target,用for循环遍历x,并用递归的方法对数量为x的横方块和数量为y的竖方块进行排列组合。(比较复杂)
解法二:斐波那契数列,经过举例发现该问题符合菲波那切数列的特点。

3.代码
解法一:

public class Solution {
    public int RectCover(int target) {
        int x;
        int y;
        int count = 0;
        if(target == 0){
            return 0;
        }
        for(x = 0; x <= target; x++){
            y = (target - x)/2;
            if((target -x)%2 != 0){
                count = count + fseqence(++x,y);
            }
            else {
                count = count + fseqence(x,y);
            }
        }
        return count;
    }
    
    public int fseqence(int x, int y){
        if(x==0||y==0)
            return 1;
        else 
            return fseqence(x-1,y)+fseqence(x,y-1);
    }
}

解法二:

public int RectCover(int n) {
    if (n <= 2)
        return n;
    int pre2 = 1, pre1 = 2;
    int result = 0;
    for (int i = 3; i <= n; i++) {
        result = pre2 + pre1;
        pre2 = pre1;
        pre1 = result;
    }
    return result;
}

一、跳台阶:
1.题目描述
一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
2.解题思路:斐波那契数列。
3.代码

public int JumpFloor(int n) {
    if (n <= 2)
        return n;
    int pre2 = 1, pre1 = 2;
    int result = 1;
    for (int i = 2; i < n; i++) {
        result = pre2 + pre1;
        pre2 = pre1;
        pre1 = result;
    }
    return result;
}