Java语言学习总结 进阶篇 方法重载,递归调用

方法重载

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杆:

  1. 每次只能移动一个圆盘
  2. 大盘不能叠在小盘上面
    递归思想
  3. 将X杆上的n-1个圆盘都移到空闲的Z杆上,并且满足上面的所有条件
  4. 将X杆上的第n个圆盘移到Y上
  5. 剩下问题就是将Z杆上的n-1个圆盘移动到Y上了
    公式描述有点麻烦,用语言描述下吧:
  6. 以Y杆为中介,将前n-1个圆盘从X杆挪到Z杆上(本身就是一个n-1的汉诺塔问题了!)
  7. 将第n个圆盘移动到Y杆上
  8. 以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);
	    }
	}
	
}
发布了16 篇原创文章 · 获赞 3 · 访问量 3371

猜你喜欢

转载自blog.csdn.net/Ace_bb/article/details/104024521