青蛙跳跳台阶问题

一 青蛙跳台阶问题

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

问题的分析:

一级台阶:1种 fib(1)=1 
二级台阶:2种 fib(2)=2 
三级台阶:3种 fib(3)=fib(1)+fib(2)=3 
四级台阶:5种 fib(4)=fib(2)+fib(3)=5 
五级台阶:8种 fib(5)=fib(3)+fib(4)=8  规律如下:fib(n)=fib(n-1)+fib(n-2),fib(1)=1,fib(2)=2。 

java代码如下所示(直接在main函数中调用即可)


public int jumpFloor(int number) {
        if (number == 1)
            return 1;
        else if (number == 2)
            return 2;
        else 
            return jumpFloor(number-1)+jumpFloor(number-2); 

    } 

二  变态青蛙跳台阶问题

变态跳台阶问题是这样的:如果青蛙可以一次跳 1 级,也可以一次跳 2 级,一次跳 3 级,…,一次跳 n 级。问要跳上第 n级台阶有多少种跳法?

同样的,我们采用逆向思维,将问题改为:跳上第 n级台阶该怎么跳?答案如下:

要跳上第 n级台阶,可以从第 n1级台阶一次跳上来,也可以可以从第 n2级台阶一次跳上来,也可以可以从第 n3级台阶一次跳上来,…,也可以可以从第 1级台阶一次跳上来。那么问题就很简单啦,同样的,令 f(n) 表示从第一级台阶跳上第 n级台阶有几种跳法。则有如下递推公式: 

f(n)=f(n1)+f(n2)+...+f(1)

同时, f(n1) 也可以表示如下: 
f(n1)=f(n2)+f(n3)+...+f(1)
所以,由上面两个公式可知: 
f(n)=2f(n1)=4f(n2)=8f(n3)=...

即: 
f(n)=2f(n1)=22f(n2)=23f(n3)=...=2n1f(n(n1))=2n1f(1)
因为  f(1)=1 ,所以  f(n)=2n1

代码如下:

int square(int a) { return a * a; }
int power2(int n) { // 计算2的n次方
    if (0 == n) return 1;
    return n % 2 ? square(power2(n>>1))<<1 : square(power2(n>>1));
}

int jumpFloorII(int number) {
    return power2(number - 1);
}

 
 

猜你喜欢

转载自blog.csdn.net/qauchangqingwei/article/details/80886280