目录
一.方法
1.方法的定义
每个方法都表示一种行为或者能力。方法类似于c语言的函数,为了提高代码的可利用性,将每个功能模块抽象成为一种方法。
例如:
//计算1!+ 2! + 3! + 4! + 5!
int sum = 0;
for(int i = 1;i < 5; i++){
int temp = 0;
for(int j = 0;j < i;j++){
temp *= j;
}
sum += temp;
}
System.out.println(sum);
像如上这个例子,可以将求阶乘和加法封装为一种方法,在使用的过程中只需要调用该方法就可以解决。
在JAVA里如何定义一个方法呢?请看下面这个例子:
public static int add(int a, int b){
return a + b;
}
不难看出,首先需要确定该方法的访问权限 public ,意味着可以被任何类来使用,其次static说明了该方法为全局的,然后加上方法的返回类型和形式参数。一堆中括号包含了方法的内容。
方法一旦定义,就必须写他的实现。方法的定义位置可以任意放置,这一点是和C语言有所不同。
2.方法的调用
方法的调用跟c语言函数调用类似,也就是方法名加参数的方法来调用。
int a = 10;
int b = 20;
int sum = add(a,b);
System.out.println(sum);
需要注意的是,对方法进行传参的时候发生形参实例化,只是形参实例化对实参的一份拷贝,并不直接拿取实际参数的值。
如果一个函数没有返回值,那么需要用void来定义返回值类型,在方法中也可以用return来返回,不执行return下面的代码直接返回。
方法可以在任意位置被调用。
3.方法重载(overload)
在同一个类中,如果想要调用一种功能,但是由于参数的类型或者参数的个数不同,可能需要不同的方法,这样效率就大大降低,有没有一个办法可以将他们按照类型或者个数区分开呢?这里引进一个方法重载的概念。
·定义:在同一个类中,定义了若干方法名称相同,参数列表不同(参数类型或者参数个数),与返回值无关,这样的一组方法称为重载方法。举例如下:
public static double add(double a,double b){
return a + b;
}
public static int add(int a,int b){
return a + b;
}
public static double add(double a,double b,double c){
return a + b + c;
}
public static int add(int a,int b,int c){
return a + b c;
}
这样,在调用时就只用调用add,传入想要传入的参数,会自动根据类型或者个数进行调用。
在JAVA中println就是采用方法重载的方法可以接受所有类型的参数。
4.方法的递归
·定义:一个方法在执行的过程调用自身,就称为递归。
递归的三要素:
·一个大问题可以拆分成多个子问题
·拆分后子问题和原问题除了数据规模不相同,他们的解决思路完全相同
·需要存在递归出口
例如求一个数num的阶乘:
num!= num * num-2 * num-3 *······*1
拆分为 num * fac(num -1)
终止条件 num == 1
如何写递归?
写递归一定需要注意方法的予以,不要纠结这个递归过程如何实现,不要思考定义(调用自身),考虑调用某种写好的方法。
public class Recursion{
public static void main (String []args){
System.out.println(fac(5);
}
//递归求阶乘
public static int fac(int num){
//终止条件
if(num == 1)
return 1;
//拆分问题
//当前已知的时num,不知道num-1!
//num - 1 的问题交给fac(num - 1)
//拼接答案
return num * fac(num - 1);
}
}
在上图的代码中,运行的过程如下:
递归的基本过程如图所示,不停的入栈,最后到达递归出口时不停的出栈,把每一层的返回值调用出来,就形成递归的基本结构。不难看出,使用递归需要开辟大量的栈空间,会耗费大量的内存资源,因此递归方法存在此缺陷。
递归是数据结构与算法的基础,包括链表的天然递归,二叉树等等。
有关递归的一些名词:
回溯法:基于递归
动态规划:解决递归问题
递归的例题如下:
1.定义一个方法,返回这个方法各个位数之和
解: ·首先拆分成求个位的数和除以10后的数的和
·其次求除以10的和就是求该数和继续除以10的和
·递归出口是该数小于9
代码实现:
public static int sum(int num)
{
if(num < 9)
return num;
return num % 10 + sum(num/ 10);
}
2.定义一个方法,按从最高位到最低位打印
解: ·首先拆分:,,首先找到最高位,打印每一位打印最高位和剩余的位数
·其次解决问题思路:和打印最高位相同
·递归出口:该数小于9
public static void printNum(int a)
{
if(a > 9)
printNum(a / 10);
System.out.print(a % 10 + " ");
}
}
3.实现斐波那契数
( n = 1,1
n = 2 ,1
n = 3 , 2= n1 + n2
n = 4 , 3= n2 + n3
n = n-2 + n-1
)
解:
public static int fibonacci(int num)
{
if( num == 1 || num ==2)
return 1;
return fibonacci( num - 1) + fibonacci( num - 2);
}