版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/L_0000/article/details/82529686
常见台阶跳法:
- 小明(一只青蛙)一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法
- 小明(或一只青蛙)一次可以跳上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 种