目录
1.方法的使用
1.1什么是方法
方法就是一个代码片段,类似c语言中的“函数”。就是把一段{}中代码抽出来的片段。
方法存在的意义:
1.是能够模块化的组织代码(当代码规模比较复杂的时候)
2.做到代码被重复使用,一份代码可以在多个位置重复使用
3.让代码更好理解更简单
4.直接调用现有的方法,不必重复造轮子
1.2方法的定义语法
public static 方法返回值 方法名称(0...N){
//方法体代码
【return 语句】;
}
1.3方法的调用
返回值变量 = 方法名称(参数);
import java.util.Scanner;
public class Best {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入第一个数:");
int a = sc.nextInt();
System.out.println("输入第二个数:");
int b = sc.nextInt();
System.out.println("输入第三个数:");
int c = sc.nextInt();
System.out.println(a+","+b+"和"+ c+"中最大的是"+ max2(a,b,c));
// max2把a,b,c先赋值给x,y,z
}
public static int max2(int x,int y ,int z ){
int sum = max(x,y);
// 调用max方法,将x,y赋值给下面的x,y
return max(sum,z);
// 经过下面max的方法判断出x,y的大小,最大值num在赋值给sum,
// 再次调用max方法,将sum和z的值赋给下面的x,y,将最大值赋给max2
}
public static int max( int x,int y){
if (x > y){
int num = x;
return x;
}else{
int num = y;
return num;
}
}
}
//运行结果
输入第一个数:
3
输入第二个数:
4
输入第三个数:
6
3,4和6中最大的是6
基本规则:
1.定义方法的时候,不会执行方法的代码,只有调用的时候才会执行。
2.当方法被调用的时候,会将实参赋值给形参。
3.参数传递完毕后,就会执行到方法体代码。
4.当方法执行完毕后(遇到return语句),就执行完毕,回到方法调用位置继续往下执行。
5.一个方法可以被多次调用。
**实参和形参的关系:在Java中,方法的参数传递只有值传递,所谓的值传递就是把实参的值赋值给形参,对实参没有任何影响。方法的返回值可有可无,没有返回值的方法使用void声明,仍然可以使用return;表示提前结束方法的调用。(直接终止本次方法的调用,返回调用处继续执行)
1.4没有返回值的方法
public class Copy {
public static void main(String[] args) {
int num = 1234;
sum(num);
}
public static void sum (int num){
// 没有返回值,只需要打印,只是输出。
if (num > 9){
sum(num / 10);
//找到最高位
}
System.out.print(num % 10+"\t");
// 按顺序打印每一位
}
}
//运行结果
1 2 3 4
没有返回值的方法用void。
1.5方法的重载
方法重载(overload)):方法重载发生在同一个类中,定义了若干个方法名称相同,参数列表不同(参数的类型或个数)的一组方法,与方法的返回值无关!Java中System.out.println(任何参数类型都可以),实际上是因为System定义了N个重载方法。
在上面的那个代码中,在同一个class类中,定义了max和max2,参个数不同,发生了方法重载。
2.递归
2.1什么场景下能用方法递归?(数据结构和算法)
方法递归:在方法执行的内部,自己调用了自己内部的过程。
public void test(){
text();
}
两个过程:递过程:不断调用自身,直到走到函数的终止条件,第一阶段结束。
归过程:函数不断返回的过程。
2.2 什么场景下可以用方法递归?
a.一个大问题可以拆分成若干个子问题的解。
b.拆分后的子问题和原问题除了数据规模不同,解决思路完全相同。
c.必须存在递归的终止条件。
2.3 咋样写出递归代码?
在写递归函数时,千万不要纠结函数内部咋实现,而要注意这个方法的语义(这个方法到底有什么方法),你就假设这个方法别人已经写好了,只需要自己拿来调用而已。
写出递归代码分为以下几步:终止条件+不借助任何方法就能实现的步骤+剩下的问题利用这个方法去解决。
递归函数的关键:方法调用时程序会卡在方法的调用处,直到方法继续运行。
2.4使用递归的练习
2.4.1 使用递归求N的阶乘
import java.util.Scanner;
public class Diguijiecheng {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数N:");
int num = sc.nextInt();
System.out.println("N的阶乘为:"+ sum(num));
}
public static int sum ( int num){
if (num == 1){
return 1;
}
return num * sum (num - 1);
}
}
//运行结果
请输入一个整数N:
4
N的阶乘为:24
2.4.2 使用递归解决青蛙跳台阶问题
青蛙一次可以跳一节台阶,也可以跳2节台阶,求青蛙跳n节台阶一共有多少种方法。
import java.util.Scanner;
public class Frog {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入台阶个数:");
int num = sc.nextInt();
System.out.println("有"+jump(num)+"种方法");
}
public static int jump(int num) {
if (num == 1 || num == 2) {
return num;
}
return num = jump(num - 1) + jump(num - 2);
}
}
//运行结果
请输入台阶个数:
20
有10946种方法
可以类比为斐波那契数。
2.4.3 计算1+2+3+...+n的和。
import java.util.Scanner;
public class He {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = sc.nextInt();
System.out.println("1到这个数之间所有的整数和:"+sum(num));
}
public static int sum(int num){
if (num == 1){
return 1;
}
return num + sum (num -1);
}
}
//运行结果
请输入一个整数:
5
1到这个数之间所有的整数和:15
2.4.4 用归找出数组的索引
public class DiGui {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
System.out.println(sum(arr,9,0, arr.length - 1));
}
public static int sum (int[] num ,int toFind ,int left,int right){
if(left > right){
return -1;
}
int mid =(left + right ) / 2;
if (num[mid] == toFind){
return mid;
}else if(toFind < num[mid]){
return sum(num,toFind,left,mid - 1);
}
return sum(num, toFind, mid + 1 , right);
}
}
// 运行结果
8
2.4.5汉诺塔问题
public class HannoiTower {
public static void main(String[] args) {
int n = 3;
hannoiTower(n,'A','B','C');
}
public static void hannoiTower(int nDisks, char A,char B,char C){
if(nDisks == 1){
//直接一步到位,用不到B,A上的这个盘子直接给到C。
move(nDisks,A,C);
return;
}
hannoiTower(nDisks-1,A,C,B);
//n >= 2,先把顶上的n - 1个盘子从A移动到B。
//剩下n个盘子,直接把第n个盘子从A移动到C。
move(nDisks,A,C);
//再把n - 1个盘子从B移动到C。
hannoiTower(nDisks-1,B,A,C);
}
public static void move(int nDisks,char sourceTower,char destTower){
System.out.println("编号为"+nDisks+"的盘子正在从"+sourceTower+"移动到"+destTower);
}
}
//运行结果
编号为1的盘子正在从A移动到C
编号为2的盘子正在从A移动到B
编号为1的盘子正在从C移动到B
编号为3的盘子正在从A移动到C
编号为1的盘子正在从B移动到A
编号为2的盘子正在从B移动到C
编号为1的盘子正在从A移动到C
3.每日一汤
谁会记得昨天吃了什么?记得三天前吃了什么?你的菜单是什么?你记不住了,但是这些东西成为了你的养分。读书也是这样,我们并不需要记住那些精彩的段落,我们只需要去读,慢慢的就成为了我们的养分。也许今日所学,你并不完全记忆,但是每日去积累,总有那么一天,你会剥开那层云雾,看见蓝天。加油,求学小子!