算法小练习
不死的兔
解法一:直接用循环的思想来解答
public class Test3 {
public static void main(String[] args){
// 解法1
int[] arr=new int[12];
arr[0]=1;
arr[1]=1;
//第一个月加第二个月等于第三个月的数量
for (int i = 2; i < arr.length; i++) {
arr[i]=arr[i-1]+arr[i-2];
}
System.out.println(arr[11]);
//解法2
System.out.println(getRabbit(12));
}
解法二:
用递归的思想
递归的两大核心:找到递归出口
找到递归的规律
public class Test3 {
public static void main(String[] args){
//解法2
System.out.println(getRabbit(12));
}
private static int getRabbit(int i) {
if (i==0||i==1){
return 1;
}
return getRabbit(i-1)+getRabbit(i-2);
}
}
吃猴的桃
我们还是用递归的方法来完成
首先找到递归的出口:第十天的时候
第十天:只剩1个
第九天:剩上一天加一个×2
第八天:第九天加一×2
........
public class Test3 {
public static void main(String[] args){
System.out.println(getMos(1));
}
private static int getMos(int i) {
if(i<=0||i>=11){
return -1;
}
//递归出口
if (i==10){
return 1;
}else {
return (getMos(i+1)+1)*2;
}
}
}
爬楼的明:
从第一层往上面计算非常麻烦,我们可以从第19层开始看
当 n = 1 时,只有一种方法,即一次爬 1 阶,所以 f(1) = 1。
当 n = 2 时,有两种方法:一次爬 2 阶;分两次,每次爬 1 阶,所以 f(2) = 2。
当 n > 2 时,到达第 n 阶楼梯的最后一步可能是从第 n - 1 阶爬 1 阶上来的,也可能是从第 n - 2 阶爬 2 阶上来的。所以爬到第 n 阶楼梯的方法数等于爬到第 n - 1 阶楼梯的方法数加上爬到第 n - 2 阶楼梯的方法数,即 f(n) = f(n - 1) + f(n - 2)。
public class ClimbingStairs {
public static int climbStairs(int n) {
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
int first = 1;
int second = 2;
int third = 0;
for (int i = 3; i <= n; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
public static void main(String[] args) {
int n = 5;
int result = climbStairs(n);
System.out.println("爬到第 " + n + " 阶楼梯的不同方法数为: " + result);
}
}