一.重载
函数的重载指的是同一个类中出现的同名函数
注:被重载的方法必须具有不同的参数列表,不能基于不同的返回值类型来重载函数
有时调用一个方法时,会有两个或更多的可能的匹配,但是编译器无法判断哪个是最精准的匹配,这种错误称为歧义调用
下面是关于歧义调用的代码:
class Test01{ public static void main(String[] args){ int a=3; int b=4; System.out.println(add(a,b)); } public static double add(int a,double b){ System.out.println("int+double"); return a+b; } public static double add(double a,int b){ System.out.println("double+int"); return a+b; } public static double add(double a,double b){ System.out.println("double+double"); return a+b; } public static int add(int a,int b){ System.out.println("int+int"); return a+b; } }
由于主函数不知道该调用哪个函数,所以报错。因为int 类型的数用double类型也可以输出,所以主函数不知道调用哪个
重载与权限没关系,与返回值类型没关系,与参数名没关系,只有和参数类型的排列组合有关系(注意一下参数类型的向下兼容问题)
重载的好处就在于我们可以扩展函数的功能(函数重名,但是参数类型不一样,执行内容也可以不一样)--换言之就是我们可以将公共部分写在主函数,将特有的写在其他函数中,需要调用时我们只需要调用这个函数即可,这样就会大大减小主函数代码。
二.递归
递归其实就是函数调用函数本身,最具代表性的递归问题是汉诺塔。
递归其实就是分治法的一种实现思路。
分治法是一种算法思想,分治法主要解决的问题是将大问题,进行拆分,拆分成若干个小的问题进行求解,最终将每个小问题的解进行合并。其实,分治法就是一种暴力破解法(穷举),也是一种搜索最优答案的算法
下面就是一个关于递归的函数:
class Test02{
public static void main(String[] args){
show();
}
public static void show(){
System.out.println("show....");
show();
}
}
递归与迭代(for循环)的区别就在于:递归是函数调用其本身;而迭代则是函数调用其他函数
递归就是函数在进栈,进栈的次数多了,势必会占内存,无法避免
递归的解决步骤:递归递归,先递后归。主要分为三步:前进段:指的就是讲问题从大化小;结束段:问题无法再继续化小,则处理当前的问题;返回段:将小问题处理完毕之后,向上返回(有些问题是不需要返回的)。
用递归解决问题时,首先要先判断出触底条件(也就是最小的条件),再从最小条件向上返回。