斐波那契数列/跳台阶/变态跳台阶/矩形覆盖

题目1:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39

public class Solution {
    public int Fibonacci(int n) {
        if(n == 0)
            return 0;
        if(n==1 || n==2)
            return 1;
        else
            return Fibonacci(n-1)+Fibonacci(n-2);//注1
    }
}

注1:计算递归调用次数(n>=3时),可改为

 return Fibonacci(n-1)+Fibonacci(n-2)+1;//算上调用自己那次

笔记:

没啥好说的,n没有大数不会溢出,递归不影响性能。


题目2:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

public class Solution {
    public int JumpFloor(int target) {
        if(target == 1)
            return 1;
        if(target == 2)
            return 2;
        else
            return JumpFloor(target-1)+JumpFloor(target-2);
    }
}

笔记: 本质还是斐波那契数列

  1. target = 1时有1种跳法;
  2. target = 2时有2种跳法;
  3. target >= 3时,最后1步跳的是1级时有JumpFloor(target-1)种跳法;最后1步跳的是2级时有JumpFloor(target-2)种跳法。

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

public class Solution {
    public int JumpFloorII(int target) {
        if(target == 1)
            return 1;
        if(target ==2)
            return 2;
        else
            return 2*JumpFloorII(target-1);
    }
}

笔记:

JumpFloorⅡ(target) => f(n)
f(1) = 1
f(2) = 2 = f(1) + 1
f(3) = 4 = f(2) + f(1) + 1
……
f(n-1) = f((n-1)-1) + f((n-1)-2 + … + f(1) + 1 = f(n-2) +f(n-3) + … +f(1) + 1
f(n) = f(n-1) + f(n-2) +f(n-3) + … +f(1) + 1 = 2*f(n-1)

题目3:我们可以用2X1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个X1的小矩形无重叠地覆盖一个2Xn的大矩形,总共有多少种方法?

public class Solution {
    public int RectCover(int target) {
        if(target == 0)//注1
            return 0;
        if(target == 1)
            return 1;
        if(target == 2)
            return 2;
        else
            return RectCover(target-1)+RectCover(target-2);
    }
}

注1:加入了对target == 0的判断。

你可能感兴趣的:(代码向,剑指offer,java)