目录
1.sort 排序
解题:
2.
解法一:
解法二:递归(具体细节见之前初始递归)
3.猴子吃桃
解法一:
解法二:递归
4.爬楼梯
递归解题心得:
解题前先了解一个字符串比较的方法:
String s1 = "apple";
String s2 = "banana";
System.out.println(s1.compareTo(s2)); // 返回负数-1
String s3 = "banana";
String s4 = "bandy";
System.out.println(s3.compareTo(s4)); // ,因为前三个字符相同,比较a和r -1
String s5 = "cherry";
String s6 = "cher";
System.out.println(s5.compareTo(s6)); // 返回长度差2
String类的compareTo方法是一个用于比较两个字符串的自然顺序的方法。返回的是 Ascii 码值相减的结果。
从第一个字符开始逐个对比不相等的字符的ASCII码,如果所有对应位置的字符都相等,则较短的字符串被认为“小于”较长的字符串,并返回长度差
Girl:
public class Girl {
private String name;
private int age;
private int high;
构造方法+set+get....
@Override
public String toString() {
return "Girl{name = " + name + ", age = " + age + ", high = " + high + "}";
}
}
main:
public static void main(String[] args) {
//创建对象,并初始化
Girl g1 = new Girl("xiaoli", 18, 167);
Girl g2 = new Girl("xiaowang", 20, 166);
Girl g3 = new Girl("xiaohe", 19, 168);
Girl g4 = new Girl("aaa", 18, 167);
//对象装入Girl 类型对象的数组
Girl[] arr = {g1, g2, g3, g4};
//调用sort方法,使用匿名内部类的写法,并用lambda简化
Arrays.sort(arr, (o1, o2) -> {
//先按年龄排序
int temp = o1.getAge() - o2.getAge();
//如果年龄不一样(temp不会为0),直接按年龄排序
//若年龄一样 则按身高 ,否则temp不变,并再次赋值给temp
temp=temp==0?o1.getHigh()-o2.getHigh():temp;
//若身高一样,则按名字排序, 否则temp不变,并再次赋值给temp
temp=temp==0?o1.getName().compareTo(o2.getName()):temp;
//因为底层逻辑只考虑temp的 正、负和0
if (temp>0){
return 1;
}else if (temp<0){
return -1;
}else {
return 0;
}
}
);
//记得重写toString再打印(底层调用toString)
System.out.println(Arrays.toString(arr));
}
sort 排序底层逻辑见 Arrays 介绍
引用图解:
这里以 对 为单位
可以发现规律:
从第三月起: 每个月份的兔子对数= 前两月兔子对数的和(斐波那契数列)
有两种解法:
package com.lt2.test;
public class Test02 {
public static void main(String[] args) {
//解法一:创建数组,用数组存储每月兔子对数
int arr[] = new int[12];
arr[0]=1;
arr[1]=1;
//从第三月起,放入前两月兔子对数
for (int i = 2; i
public class Test02 {
public static void main(String[] args) {
System.out.println(fn(12));//144
}
//规律:
//g(12)=g(11)+g(10)
//g(11)=g(10)+g(9)
// ...
//g(3)=g(2)+g(1)
//g(2)=g(1)=1
//出口:month
public static int fn(int month){
//出口
if (month==2||month==1){
return 1;
}
return fn(month-1)+ fn(month-2);
}
}
规律
day10: 1
day9:(day10+1)*2=4
day8:(day9+1)*2=10
...总共循环还原九次
int sum=1;//第十天的
//循环9次还原第一天
for (int i = 0; i <9 ; i++) {
sum=(sum+1)*2;
}
System.out.println(sum);//1534
public class Houzi {
public static void main(String[] args) {
//要求第一天
System.out.println(fn(1));//1534
}
//规律
//day10:1
//day9:(day10+1)*2=4
//day8:(day9+1)*2=10
// ...
public static int fn(int number){
if (number==10){
return 1;
}
return (fn(number+1)+1)*2;
}
}
本质是找规律:
画图理解:
当台阶数为 4 阶时,我们其实可以不用在乎他中间是怎么爬的,
我们应该想在最后一步如何到达第 4 阶,一定是从第 3 阶或第 2 阶上来的、因此将到达第 3 阶和第 2 阶的所有爬法加在一起即可,=5
得出规律:某一阶数 爬法=它的前两阶爬法之和
可以看出是一个斐波那契数列
递归实现:
public class Test03 {
public static void main(String[] args) {
System.out.println(fn(20));//10946
}
// 规律:
// fn(20)=fn(19)+fn(18)
// fn(19)=fn(18)+fn(17)
// .....
public static int fn(int number){
//出口
if (number==1){
return 1;//爬法
}
if(number==2){
return 2;//爬法
}
return fn(number-1)+fn(number-2);
}
}
若我们修改下题目,还能一次爬三阶
得出规律:某一阶数 爬法=它的前三阶爬法之和
public class Test03 {
public static void main(String[] args) {
System.out.println(fn(20));
}
// 规律:
// fn(20)=fn(19)+fn(18)+fn(17)
// fn(19)=fn(18)+fn(17)+fn(16)
// .....
public static int fn(int number){
if (number==1){
return 1;//爬法
}
if(number==2){
return 2;//爬法
}
if (number==3){
return 4;//爬法
}
return fn(number-1)+fn(number-2)+fn(number-3);
}
}
答案: 121415
可根据规律解题
解题时: