台阶问题——1、可以跳1阶2阶,2、可以跳1阶2阶3阶...n阶

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/L_0000/article/details/82529686

常见台阶跳法:

  1. 小明(一只青蛙)一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法
  2. 小明(或一只青蛙)一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?

这其实是斐波那契数列

问题1:分析

当n = 1, 只有1中跳法;
当n = 2时,有两种跳法;
当n = 3 时,有3种跳法;
当n = 4时,有5种跳法;
当n = 5时,有8种跳法;
…….
规律类似于Fibonacci数列(1,1,2,3,5,8,13,……)

问题1 的Java实现:

public static int jump1(int num) {
    //fibonaci:1,1,2,3,5,8,13,21……
    if(num <0) return -1;
    if(num == 1 || num == 2) return 1;  
    return jump1(num-1)+jump1(num-2);
}

问题2 :分析:

用Fib(n)表示青蛙跳上n阶台阶的跳法数
设定Fib(0) = 1;
当n = 1 时, 有0+1:Fib(1) = Fib(0) = 1;
当n = 2 时, 有:0+2,1+1:Fib(2) = Fib(1) + Fib(0) = 2;
当n = 3 时,有:0+3,1+1+1,1+2,2+1,:Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;
……
当n = n 时,有Fib(n) = Fib(n-1) + Fib(n-2) + …… + Fib(2) + Fib(1) + Fib(0) ;

计算分析:

Fib(n) = Fib(n-1) + Fib(n-2) + Fib(n-3)…… + Fib(2) + Fib(1) + Fib(0) (1)
Fib(n-1) = Fib(n-2) + Fib(n-3) + Fib(n-4)…… + Fib(2) + Fib(1) + Fib(0) (2)
把(2)式代入(1)式,即可得:
n阶跳:Fib(n) = 2*Fib(n-1) = 2^(n-1)

问题2的Java实现:

public static int jump1(int num) {
//fibonaci:1,1,2,3,5,8,13,21……
    if(num <0) return -1;
    if(num == 1 || num == 2) return 1;  
    return jump1(num-1)+jump1(num-2);
}

public static int jump2(int num) {
    return 1<<(num-1);//移位操作更快,2^(n-1)
}

运行结果如下:

跳到  10 阶
1阶2阶的跳法有 55 种
1阶2阶……n阶的跳法有 110 种
跳到  20 阶
1阶2阶的跳法有 6765 种
1阶2阶……n阶的跳法有 13530 种
跳到  5 阶
1阶2阶的跳法有 5 种
1阶2阶……n阶的跳法有 10 种

猜你喜欢

转载自blog.csdn.net/L_0000/article/details/82529686