前言
一、方法的使用
1.方法定义:每个方法都表示一种能力或行为
方法类似于C语言
方法就是一个代码片段,为了此代码能够重复使用,我们将此代码抽象为方法
当有循环嵌套和多个分支时,代码的结构变得复杂,不太容易阅读
public static 返回值声明 方法名称(参数类型 参数名...){
[return 返回值];
}
定义一个方法进行两个整数的叠加
看一个方法到底有没有返回值取决于这个方法的功能
2.方法的调用:通过主方法调用
数据类型 变量 = 方法名称(参数);
若方法没有返回值:使用void 声明返回值类型,且仍然可以使用return;(表示提前结束方法的调用)
在java中没有函数声明的概念。一旦定义了一个方法必须写他的实现。
调用该函数与该函数定义位置无关,可以在方法实现代码之前调用方法。
3.方法的参数传递
java方法的参数传递只有值传递,只是将实参的值复制一份给形参
若想改变原数据,使用引用类型(所有引用类型存的都是地址)
4.方法的重载
定义:在同一个类中,定义了若干个方法名称相同,参数列表不同(参数类型或个数),与返回值无关,这样的一组方法称为重载方法
为什么println方法里面可以接受所有类型?
因为println定义了N个重载方法.
思考:请解释方法重载(overload)和方法重写(override)的区别?
5.补充debug:
IDEA debug:当出现程序编译运行都正常,但是运行结果不是预期结果,用到调试。
1.想要暂停的代码旁打断点
2.按照需求进行
二、方法递归
概念:一个方法在执行过程中调用自身,是数据结构与算法基础
比如:
回溯法:基于递归
动态规划:解决递归问题
链表天然递归结构
那些场景下可以使用递归解决问题?
1.一个大问题可以拆分成多个子问题的解
2.拆分后的子问题和原问题除了数据规模不一样,他们解决思路完全相同
3.存在递归终止条件。
如何写出递归代码?
一定要注意方法的语义(这个方法能做什么),不要纠结这个递归如何实现
需要思考如何使用这个方法解决问题
不要当作是自己调用自己,认为是调用的别人写好的代码
如何使用递归方法实现求一个数的阶乘?
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int num= scanner.nextInt();
System.out.println(jieCheng(num)+" "+factor(num));
}
public static int jieCheng(int num){
int n=1;
for (int i = 1; i <=num ; i++) {
n*=i;
}
return n;
}
//传入一个值就能返回他的阶乘
public static int factor(int num ){
//终止条件
if(num==1){
return num;
}
//拆分问题
//现在已经知道num但是不知道num-1的结果,因此将num-1交给factor
return num*factor(num-1);
}