题目
(题目来自牛客网站)
思路1.青蛙角度
1.青蛙角度
关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:f(n)表示n个台阶有多少种跳法
f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-1) 表示2阶一次跳1阶的次数。f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3) //f(3-1) 表示3阶一次跳1阶的次数。f(3-2) 表示3阶一次跳2阶的次数。f(3-3)表示一次跳3阶的次数。
…
f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)
说明:
n = 1时,只有1种跳法,f(1) = 1
n = 2时,两种方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)= f(1) + f(0)
n = 3时,三种方式,1阶、2阶、3阶,f(3) = f(3-1) + f(3-2)+ f(3-3)= f(2) + f(1) + f(0)
……
n = n时,会有n中跳的方式,1阶、2阶…n阶,得出结论:
f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)
6) 由以上已经是一种结论,但是为了简单,我们可以继续简化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出:f(n) = 2f(n-1)
7) 得出最终结论,在n阶台阶,一次有1、2、…n阶的跳的方式时,总得跳法为:
-1 ,(n=0 )
f(n) = 1 ,(n=1 )
2f(n-1),(n>=2)
思路2.台阶角度
2.台阶角度
n个台阶就有n块木板,最后一块木板是青蛙到达的位子, 必须存在,其他 (n-1) 块木板可以任意选择是否存在,则每个木板有跳和不跳在两种选择,(n-1) 块木板 就有 [2^(n-1)] 种跳法,可以直接得到结果。
代码
import java.util.Scanner;
public class JumpFloorII {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int target = input.nextInt();
System.out.println("跳上一个" + target + "级的台阶总共有"
+ jumpFloor(target) + "种跳法");
}
//青蛙角度
//只有一种方法
public static int jumpFloor(int target) {
if (target <= 0) {
return -1;
} else if (target == 1) {
return 1;
} else {
return 2 * jumpFloor(target - 1);//2*f(n-1)
}
}
//台阶角度
// 第一种做法
// public static int jumpFloor(int target) {
// if (target <= 0) return 0;
// return (int) Math.pow(2, target - 1);//除了最后一个台阶一定要跳,剩下的n-1阶台阶都有两
//种选择:跳和不跳,所以共有2^(n-1)种方法
// }
//第二种做法
//public static int jumpFloor(int target) {
// if (target <= 0) return 0;
// if (target == 1) return 1;
// int a = 1;
// int b = 2;
// for (int i = 2; i <= target; i++) {
// b = 2 * a;//除了最后一个台阶一定要跳,剩下的n-1阶台阶都有两种选择:跳和不跳
// a = b;
// }
// return b;
// }
}