初级青蛙跳台阶
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析思路
青蛙跳台阶,经典递归问题,依旧的大事化小方法。
当青蛙只跳一级台阶时
显而易见,只有一种跳法,跳一级
当青蛙跳两级台阶时
两种方法
跳两次一级和一次跳两级
当青蛙跳三级台阶时
三种方法
第一步跳一级的情况下,剩下的两级台阶有两种跳法
第一步跳两级的情况下,剩下的一级台阶有一种跳法
当青蛙跳四级台阶时
五种方法
第一步跳一级的情况下,剩下的三级台阶有三种跳法
第一步跳两级的条件下,剩下的两级台阶有两种跳法
递归方法随着分析逐步露出水面
想要用函数jumpFloor( )来计算跳N级台阶有几种跳法
当N为1时,有1种跳法;
当N为2时,有两种跳法;
N大于2时,跳的方法分成两部分
- 第一步跳了一级台阶,剩余的台阶有jumpFloor(N - 1)种跳法
- 第一步跳了两级台阶,剩余的台阶有jumpFloor(N - 2)种跳法
即 jumpFloor(N) = jumpFloor(N - 1) + jumpFloor(N - 2) ;
代码实现
📑代码示例:
public class TestDemo {
public static int jumpFloor(int num) {
if(num <= 0) {
return -1;
}else if (num == 1) {
return 1;
}else if (num == 2) {
return 2;
}
return jumpFloor(num - 1) + jumpFloor(num - 2);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextInt()) {
int num = scanner.nextInt();
int ret = jumpFloor(num);
if(ret == -1) {
System.out.println("输入错误!");
}else {
System.out.println(ret);
}
}
}
}
🏸 代码结果:
升级青蛙跳台阶
题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上N级。求该青蛙跳上一个N级的台阶(N为正整数)总共有多少种跳法。
分析思路
想要用函数jumpFloorII( )( 在下面简写成F( ) )来计算跳N级台阶有几种跳法
思路一:
根据初级青蛙跳台阶的思路,可以将递归公式拓展开来
F(N) = F(N - 1) + F(N - 2) + F(N - 3) + …+ F(N - (N - 1)) + F(N - N) (最后一项表示有N级台阶一次跳了N级,F(N - N) = 1)
F(N - 1) = F(N - 2) + F(N - 3) + …+ F((N - 1) - (N - 2)) + F((N - 1) - (N - 1))
F(N) = 2 * F(N - 1)
思路二:
据题意,说明青蛙可以想怎么跳就怎么跳,只要最后到达第N级台阶
言外之意,除了第N级台阶,其他的台阶都有被跳或者不被跳的可能
F(N) = 2 ^ (N - 1)
代码实现
📑思路一代码示例:
import java.util.Scanner;
public class TestDemo {
public static int jumpFloorII(int num) {
if(num <= 0) {
return -1;
}else if (num == 1) {
return 1;
}
return 2 * jumpFloorII(num - 1);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextInt()) {
int num = scanner.nextInt();
int ret = jumpFloorII(num);
if(ret == -1) {
System.out.println("输入错误!");
}else {
System.out.println(ret);
}
}
}
}
🏸 代码结果:
📑思路二代码示例:
import java.util.Scanner;
public class TestDemo {
public static int jumpFloorII(int num) {
if(num <= 0) {
return -1;
}
return (int)Math.pow(2,num - 1);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextInt()) {
int num = scanner.nextInt();
int ret = jumpFloorII(num);
if(ret == -1) {
System.out.println("输入错误!");
}else {
System.out.println(ret);
}
}
}
}
🏸 代码结果:
完!