方法的基本使用:
方法的定义:
访问限定符 static 方法返回值 方法名称([参数类型 形参 ......]){
方法体内代码;
[return 返回值;]
}
其中static 必须写上,因为main函数就是静态的且main函数只能调用静态函数,所以需要使用static修饰方法
访问限定符包含: public protect private;
方法的调用:
返回值变量 = 方法名称(实参);
方法的使用过程注意以下几点事项:
1.若没有返回值,一般情况下需将返回值类型写成void;(构造函数例外)
2.Java中main函数主体调用的方法无需注意其位置是否位于Mian函数上方(C语言需要注意,C语言中函数如果定义在Mian函数下面,就需要在main函数前方写这个函数的申明,而Java完全不需要考虑这方面的因素);Java中也没有函数申明这个概念
3.Java中没有指针,这个时候实现C语言中的传址操作就以来引用这一概念。
方法的递归:
递归的书写必须多家练习后,才会有比较深入的理解;
写一个递归函数的条件:
1.结束条件
2.递推公式(使得函数能越来越接近结束条件的要求)
同理依据上面所说的方法的基本写法,递归也是方法函数,需要遵循。
以下是作者本人写递归总结出来的几点经验:
1. 如果递归函数需要返回值,那么一般将结束条件写成 只能接受一种结束条件的情况;
如:递归求N的阶乘
这时候就将结束条件写成
if(N == 1){
return 1;
}
这是考虑递归代码的书写格式总结的,递归代码大体是如下的形式:
public static 返回值类型 name (type 形参) {
多次执行代码
输出返回值
}
进行递归的变化 一般就在执行代码段 或者 输出返回值 其中之一中,一般不会存在两个部分都存在递归公式
递归求N的阶乘的递归公式这时候只能书写在 输出返回值部分中了;递归公式的目的在于大事化小,也就是能够使用一个公式将
我们的目前达成,如当前的目的就是阶乘 1 * 2 * 3 *..... * n-1 * n;因为有结束条件的约束我们知道我们可以将数字依次由n减少到1去,然后将这写数字进行相乘;递归具有记录的作用,我们可以通过return 返回每一个递归的返回值达成 a * b的效果;
整体代码如下:
1 public static int factor(int num){
2 if(num == 1){
3 return 1;
4 }
5 return num * factor(num - 1);
}
我们分析当前的代码,假设输入num值是5,if条件不满足,进入到了return 语句中,该语句有一个递归公式 factor(num - 1),这时候就需要我们再次进入该语句所写的函数中去,即从5行进入到了1行,这时候需要注意的是Num的值发生了变化;依次这样执行知道我们的num =2 的时候进入的5行,然后再次进入factor(num -1)函数中,此时Num变成了1满足了结束条件if;结束条件return 返回给了 factor(num - 1)此时 5行 大概就是如此
return num * 1;
//这时候的Num = 2;
//因为,return 是返回 , 这时候就返回到了 最后一次的上一次的状态了
//简单的理解可以这样理解,我们进入的是facotr(num - 1)函数中 num - 1使得num变成了1,那么原本的Num = 2,这能够理解吧
所以这个时候的 return 2 * facotr(2 - 1); 不需要怀疑吧
而且进入后factor(2 - 1) = factor(1) = 1 这以不难理解吧
之后的内容大家应该都能想到,因为现在已经变成了返回的形式,而不是不满足条件网下进行变化的状态;
return 2 * factor(2 - 1);
这句语句这时候就会执行,那么返回到上一层的结果就是
return 3 * factor(3 - 1); 这个factor(3 -1)就是return 2 * factor(2 -1)的结果,如果第一次的一样。
一层接一层最后回到了n的大小,其总体结构不难理解就是如下的:
factor(5) = 5 * factor(4);
factor(4) = 4 * factor(3);
factor(3) = 3 * factor(2);
factor(2) = 2 * factor(1);
factor(1) = 1;
即:
factor(5) = 5 * 4 * 3 * 2 * 1;
这是比较简单的单层递归函数,其中的关键就是在于理解记忆 以及 return 的含义;
我们Num的变化就是 5 -> 4 -> 3 -> 2 -> 1 这时候满足了结束条件,然后回返
num -> 1 -> 2 - > 3 -> 4 -> 5 回到原本的值
这里讲的很多了,就不再详细说明双层/多层递归的情况了,双层递归/多层递归的关键点还需要考虑的就是同一行的返回左边的递归和右边的递归顺序的不同,虽然不影响结果但是过程的变化要注意;如两个递归在同一行的情况
如:斐波那契数列一样
public static int fib(int num){
if(num == 1 || num == 2){
return 1;
}
return fib(num - 1) + fib(num - 2);
}
注意的是先 进行的是fib(num -1 )的向下递归直到找到结束条件的满足,然后向上返回一个层的时候,这时候需要考虑右边的fib(num - 2)的递归了,如此这般,先左后右一次结束了他们的向下递归然后在向上返回层,返回层注意你当前主体是由谁潜下去的,前期肯定是左边的潜下去的,当我们左右两边向下的潜力用完后肯定是由右边的向上潜;到了后面如果主体是右边的就需要右边的向上潜了。
假设就是上面的左边是-1右边是-2 的形式;给定Num=5;他们的执行顺序定是如此:5 --> 4 --> 3 --> 2 --> 3 --> 1 --> 3 --> 4 --> 2 --> 4 --> 5 --> 3 -->2(注意这里的左右,右边为主体的时候向下潜还需要先左后右) --> 3 --> 1 --> 3 --> 5
同理如果左边是fib(num -2) 右边是 fib(num -1)
public static int fib(int num){
if(num == 1 || num == 2){
return 1;
}
return fib(num - 2) + fib(num - 1);
}
执行顺序就是:5 -> 3 -> 1 -> 3 -> 2 -> 3 -> 5 -> 4 -> 2 -> 4 -> 3 -> 1 -> 3 -> 2 -> 3 -> 4 -> 5
方法的重载:重载就是函数名相同,功能相同但是参数存在区别的函数体
满足重载的参数条件就是:
1.参数的类型不同
2.参数的个数不同
其中返回值的类型不同不能说是满足重载的条件的,即构不成重载