方法重载
1、方法重载又被称为: overload
2、什么时候考虑使用方法重载?
功能相似的时候,尽可能让方法名相同。
[但是:功能不同/不相似的时候,尽可能让方法名不同。]
3、什么条件满足之后构成了方法重载?
★在同一个类当中
方法名相同
参数列表不同:
数量不同
顺序不同
类型不同
4、方法重载和什么有关系,和什么没有关系?
方法重载和方法名+参数列表有关系
方法重载和返回值类型无关
方法重载和修饰符列表无关
代码示例:
public class overload {
public static void main(String[] args) {
overload.m1();
overload.m1(20);
overload.m2(5.11, 9.99);
overload.m2(50, 20);
}
public static void m1() {
System.out.println("这是void m1中的print输出");
}
public static void m1(int a) {
System.out.println("这是int 型m1中输出a"+a);
}
public static void m2(int a,int b) {
System.out.println("int int 型中输出a"+a+"b:"+b);
}
public static void m2(double a,double b) {
System.out.println("double double 型输出a:"+a+"b:+b");
}
}
递归调用
关于方法的递归调用
1.什么是递归?
方法自身调用自身。
直接或间接调用自己。
a() {
a();
}
2.递归是很耗费栈内存的,递归算法可以不用的时侯尽量别用。
3.以下程序运行的时候发生了这样的-一个错误[不是异常,是错误Error] :
栈内存溢出错误,
错误发生无法挽回,只有一-个结果,就是JVM停止工作。
4、递归必须有结束条件,没有结束条件一定 会发生栈内存溢出错误。
5.递归即使有了结束条件,即使结束条件是正确的,也可能会发生栈内存溢出错误。
因为递归在进行一些算法时要调用的太多了。.
注意:
递归可以不使用尽量别用.
但是有些情况下该功能的实现必须依靠递归方式.比如深度优先搜索和广度优先搜索。
例: 用递归求1~N的求和:
代码如下:
public class recursion {
public static void main(String[] args) {
int n=100;
int retValue= sum(n);
System.out.println(retValue);
}
public static int sum(int n) {
if(n==0) return 0;
else return sum(n-1)+n;
}
}
例2: 计算N的阶乘
代码如下:
public class recursion {
public static void main(String[] args) {
int n=5;
int retValue= sum(n);
System.out.println(retValue);
}
public static int sum(int n) {
if(n==1) return 1;
else return sum(n-1)*n;
}
}
递归调用过程概念图:
例题3: 计算斐波拉契数列
代码如下:
public class recursion {
//1 1 2 3 5 8 13 21 34 55 89 144
public static void main(String[] args) {
int n=12;
int retValue= sum(n);
System.out.println(retValue);
}
public static int sum(int n) {
if(n==1 || n==2) return 1;
else return sum(n-1)+sum(n-2);
}
}
例题4: 汉诺塔问题
数学描述就是:
有三根杆子X,Y,Z。X杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至Y杆:
- 每次只能移动一个圆盘;
- 大盘不能叠在小盘上面。
递归思想: - 将X杆上的n-1个圆盘都移到空闲的Z杆上,并且满足上面的所有条件
- 将X杆上的第n个圆盘移到Y上
- 剩下问题就是将Z杆上的n-1个圆盘移动到Y上了
公式描述有点麻烦,用语言描述下吧: - 以Y杆为中介,将前n-1个圆盘从X杆挪到Z杆上(本身就是一个n-1的汉诺塔问题了!)
- 将第n个圆盘移动到Y杆上
- 以X杆为中介,将Z杆上的n-1个圆盘移到Y杆上(本身就是一个n-1的汉诺塔问题了!)
package helloworld;
public class recursion {
//1 1 2 3 5 8 13 21 34 55 89 144
static int num=0;
public static void main(String[] args) {
int n=12;
recursion.hanoi(10, 'x', 'z', 'y');
System.out.println(num);
}
public static void hanoi(int n,char from,char tmp,char to) {
if (n>0) {
num++;
hanoi(n - 1, from, to, tmp);
System.out.println("take " + n + " from " + from + " to " + to);
num++;
hanoi(n - 1, tmp, from, to);
}
}
}