目录
1.方法概念及使用
1.1什么是方法
1.2方法定义
1.3 方法调用的执行过程
1.4 实参和形参的关系(重要)
1.5 没有返回值的方法
2.方法重载
3.方法递归
3.1递归概念
3.2递归执行过程分析
3.3递归练习
代码示例1
代码示例2
1.方法概念及使用
1.1什么是方法
方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义(不要背, 重在体会):
1. 是能够模块化的组织代码(当代码规模比较复杂的时候).
2. 做到代码被重复使用, 一份代码可以在多个位置使用.
3. 让代码更好理解更简单.
4. 直接调用现有方法开发, 不必重复造轮子
1.2方法定义
方法语法格式
// 方法定义 修饰符 返回值类型 方法名称([参数类型 形参 ...]){ 方法体代码; [return 返回值]; }
栗子
实现一个函数,检测一个年份是否为闰年
public class Method{ // 方法定义 public static boolean isLeapYear(int year){ if((0 == year % 4 && 0 != year % 100) || 0 == year % 400){ return true; }else{ return false; } } }
1.3 方法调用的执行过程
调用方法--->传递参数--->找到方法地址--->执行被调方法的方法体--->被调方法结束返回--->回到主调方法继续往下 执行
1.4 实参和形参的关系(重要)
public static int getSum(int N){ // N是形参 return (1+N)*N / 2; } getSum(10); // 10是实参,在方法调用时,形参N用来保存10 getSum(100); // 100是实参,在方法调用时,形参N用来保存100 public static int add(int a, int b){ return a + b; } add(2, 3); // 2和3是实参,在调用时传给形参a和b //注意:在Java中,实参的值永远都是拷贝到形参中,形参和实参本质是两个实体
1.5 没有返回值的方法
方法的返回值是可选的. 有些时候可以没有的,没有时返回值类型必须写成void
代码示例
class Test { public static void main(String[] args) { int a = 10; int b = 20; print(a, b); } public static void print(int x, int y) { System.out.println("x = " + x + " y = " + y); } }
2.方法重载
在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。
在Java中方法也是可以重载的。 在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了
public class TestMethod { public static void main(String[] args) { add(1, 2); // 调用add(int, int) add(1.5, 2.5); add(1.5, 2.5, 3.5); } // 调用add(double, double) // 调用add(double, double, double) public static int add(int x, int y) { return x + y; } public static double add(double x, double y) { return x + y; } public static double add(double x, double y, double z) { return x + y + z; } }
注意:
1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关
注意:两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的
3.方法递归
有些时候,我们 遇到的问题直接并不好解决,但是发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,等子问题解 决之后,原问题就迎刃而解了。
3.1递归概念
一个方法在执行过程中调用自身, 就称为 "递归". 递归相当于数学上的 "数学归纳法", 有一个起始条件, 然后有一个递推公式.
例如, 我们求 N! 起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件. 递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!
递归的必要条件:
1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同
2. 递归出口
代码示例: 递归求 N 的阶乘
public static void main(String[] args) { int n = 5; int ret = factor(n); System.out.println("ret = " + ret); } public static int factor(int n) { if (n == 1) { return 1; } return n * factor(n - 1); // factor 调用函数自身 } // 执行结果 ret = 120
3.2递归执行过程分析
代码示例 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4
public class axjava { //通过递归输入123,然后依次输出1 2 3 //要理解起点条件跟终止条件 public static void fun(int n){ if(n < 10){//要输出第一位,那就是个位 System.out.println(n); return ;//返回fun函数 } //如果不是个位,那么依次进行除法,消去一位。 fun(n / 10); System.out.println(n % 10);//这里输出要进行对10求余,才能得到 } public static void main(String[] args) { fun(); } }
3.3递归练习
代码示例1
实现输入一个非负整数,返回他的数字之和,例如输入1729,返回1+7+2+9
public class axjava { public static int fun2(int n){ if(n < 10){ return n; } return n % 10 + fun2(n /10); } public static void main(String[] args) { fun2(1729); } }
代码示例2
实现汉诺塔
public class axjava { //实现汉诺塔 public static void move(char pos1,char pos2){ System.out.print(" "+ pos1 + "->" + pos2); } public static void hanio(int n ,char po1,char po2 ,char po3){ if(n == 0){ return ; } else if(n == 1){ move(po1,po3); } else{ //首先,从a柱上借助c挪到b上 //然后,在b上借助a挪到c hanio(n-1,po1,po3,po2); move(po1,po3); hanio(n-1,po2,po1,po3); } } public static void main(String[] args) { hanio(4,'A','B','C'); System.out.println(); } }