学习JavaEE的日子 day08 方法的重载,递归,万年历

2024-01-07 17:15:25

day08

1.方法的重载

	>理解:方法与方法之间的关系
	>		条件:
	>			1.方法必须在同一个类中
	>			2.方法名必须一致
	>			3.参数列表的个数或者类型不一致
	>			4.与返回值无关
	>		好处:系统会根据具体实参类型自动匹配到对应的方法中
	>		应用场景:一个类的多个方法的功能一致,细节实现不一样,就可以考虑使用重载	
	/**
	定义一个方法的步骤:
		1.考虑方法名 -- 见名知意
		2.参数(参数有几个?名字怎么取?参数是什么类型)
		3.返回值(返回值是什么类型)
	
	需求:
		创建一个方法,传入两个int值,返回最大值 -- getMax
		创建一个方法,传入三个int值,返回最大值  -- getMax
		创建一个方法,传入两个double值,返回最大值 -- getMax
		创建一个方法,传入三个double值,返回最大值 -- getMax
		*/
public static void main(String[] args){
	
	System.out.println(getMax(10,20,30));
}

public static int getMax(int a,int b){
	return (a>b)?a:b;
}

public static int getMax(int a,int b,int c){
	int max = getMax(a,b);
	max = getMax(max,c);
	return max;
}

public static double getMax(double a,double b){
	return (a>b)?a:b;
}

public static double getMax(double a,double b,double c){
	double max = getMax(a,b);
	max = getMax(max,c);
	return max;
}

2.方法的递归

>概念:方法调用方法自身
	//错误示范:
	//StackOverflowError - 栈内存溢出
	//前言:方法里声明的变量叫做局部变量,其作用域就在该方法的内部
	//错误出现的原因:调用方法就会在栈内存开辟空间,用于存放该方法的局部变量,
	//				  死循环的调用方法,很快栈内存就被装满并溢出了
	method();
}

public static void method(){
	method();
}

经验:
1.找规律
2.找出口

/**
需求:设计一个方法,传入int类型的数字n,计算n的阶乘
	分析:
		5! = 1*2*3*4*5; -> 5! = 4! * 5
		4! = 1*2*3*4	-> 4! = 3! * 4
		3! = 1*2*3		-> 3! = 2! * 3
		2! = 1*2		-> 2! = 1! * 2
		1! = 1			-> 1! = 1
		找规律:n! = (n-1)! * n;
		找出口:1! = 1
*/
public static void main(String[] args){
	
	int num = getFactorial(5);
	System.out.println(num);
}

public static int getFactorial(int n){
	if(n == 1){
		return 1;
	}else{
		return getFactorial(n-1)*n;
	}
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

面试题:

/**
需求:不死神兔
		有一对兔子,从出生后第三个月起每个月都生一对兔子,
		小兔子长到第三个月后每个月又生一对兔子,
		假如兔子都不死,问第n个月的兔子对数为多少?
	
	分析:
		找规律:当月兔子的对数等于上个月+上上个月
		找出口:第一个月和第二个月兔子都是一对
*/
public static void main(String[] args){

	int num = getRabbit(8);
	System.out.println(num);
}

public static int getRabbit(int month){
	if(month == 1 || month ==2){
		return 1;
	}else{
		return getRabbit(month-1) + getRabbit(month-2);
	}
}

3.方法版本的万年历

? 需求:输入年和月,打印当月的日历
? 线索:1900年1月1日是星期一
? 分析:
? 1.输入年和月
? 2.计算出1900年1月1日到输入年输入月的第一天的总天数
? 2.1 计算1900年(包含)到输入年(排他)的总天数
? 2.2 计算1月到输入月(排他)的总天数
? 2.3 合并总天数
? 3.计算出当月的第一天是星期几
? 4.计算当月的天数
? 5.打印日历

public static void main(String[] args){

	//1.输入年和月
	Scanner scan = new Scanner(System.in);
	System.out.println("请输入年:");
	int year = scan.nextInt();
	System.out.println("请输入月:");
	int month = scan.nextInt();
	
	//2.计算出1900年1月1日到输入年输入月的第一天的总天数
	int allDay = getAllDay(year,month);
	
	//3.计算星期几
	int week = getWeek(allDay);
	
	//4.计算当月的天数
	int day = getDay(year,month);
	
	//5.打印日期
	printCalendar(year,month,day,week);
}

//打印日历
public static void printCalendar(int year,int month,int day,int week){
	System.out.println(year + "年" + month + "月");
	System.out.println("一\t二\t三\t四\t五\t六\t日");
	
	int count = 0;//换行的计数器(逢7换行)
	
	//打印空格
	for(int i = 1;i<week;i++){
		System.out.print("\t");
		count++;
	}
	
	//打印日期
	for(int i = 1;i<=day;i++){
		System.out.print(i + "\t");
		count++;
		if(count % 7 == 0){
			System.out.println();//换行
		}
	}
}

//计算星期
public static int getWeek(int allDay){
	int week = allDay%7;
	if(week == 0){
		week = 7;
	}
	return week;
}

//计算出1900年1月1日到输入年输入月的第一天的总天数
public static int getAllDay(int year,int month){
	int allDay = getAllDayOfYear(year) + getAllDayOfMonth(year,month) + 1;
	return allDay;
}

//计算1月到输入月的总天数
public static int getAllDayOfMonth(int year,int month){
	int allDayOfMonth = 0;
	for(int i = 1;i<month;i++){
		allDayOfMonth += getDay(year,i);
	}
	return allDayOfMonth;
}

//计算1900年到输入年的总天数
public static int getAllDayOfYear(int year){
	int allDayOfYear = 0;
	for(int i = 1900;i<year;i++){
		if(isLeapYear(i)){
			allDayOfYear += 366;
		}else{
			allDayOfYear += 365;
		}
	}
	return allDayOfYear;
}

//获取当月的天数
public static int getDay(int year,int month){
	int day = 0;
	switch(month){
		case 1:case 3:case 5:case 7:case 8:case 10:case 12:
			day = 31;
		break;
		case 4:case 6:case 9:case 11:
			day = 30;
		break;
		case 2:
			if(isLeapYear(year)){
				day = 29;
			}else{
				day = 28;
			}
		break;			
	}
	return day;
}

//判断是否是闰年的方法
public static boolean isLeapYear(int year){
	if(year%4==0 && year%100!=0 || year%400==0){
		return true;
	}
	return false;
}

}

文章来源:https://blog.csdn.net/weixin_69595694/article/details/135374562
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。