认识方法
方法的作用
方法相当于C语言中的函数,主要用来解决一些规模较复杂的代码。
方法可以让代码更加简洁并且更好理解
方法可以重复利用
有些方法可以直接调用,不必自己一点点从零开始创造。
方法的注意事项
可以没有返回值
实参和形参没有关系,形参只是实参的拷贝
必须在类中定义
在Java中没有函数声明的概念
方法的重载
经典题型:重载和重写的区别(重写还不会)
在同一个类当中,方法名相同,参数列表不同(类型与数量)的一组方法,与返回值无关。
详情查看博客: 方法的重载_小白的含金量的博客-CSDN博客
方法递归
什么是递归
递归概念
在一个方法内部自己调用自己的过程称之为递归
public static void test(){
test();
}
递归的子过程
递过程:函数不断调用自身,直到走到函数的终止条件,第一阶段结束。
归过程:从终止条件不断返回的过程。
递归可用场景
1.一个大问题可以拆分成若干子问题的解
2.拆分后的子问题与原问题除数据规模不同,解决思路完全相同
3.必须存在终止条件
如何写出递归
不要纠结递归方法的中间部分如何实现,就当是一个别人已经写好的方法你来调用,把重心放在函数的功能上。
递归思路
终止条件+不借助外力就可实现的步骤(我可以整)+剩下的问题交给下一次解决(我整不了,别人给我整)。
终止条件就是不需要借助任何函数就能得到的值
递归举例
n的阶乘
不借助外力只知道n这个数字,且n=1时,不需任何函数我就知道他的阶乘就是1
public class Test6 {
public static void main(String[] args) {
System.out.println("输入数字n并计算n的阶乘");
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int num = facNum(n);
System.out.println("阶乘为 "+num);
}
public static int facNum(int n) {
if(n==1) {
return 1;
}
return n*facNum(n-1);
}
}
看一下中间过程
public class Test6 {
public static void main(String[] args) {
System.out.println("输入数字n并计算n的阶乘");
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int num = facNum(n);
System.out.println("阶乘为 "+num);
}
public static int facNum(int n) {
System.out.println("函数开始, n = "+n);
if(n==1) {
System.out.println("函数结束, n = 1,ret = 1");
return 1;
}
int ret = n*facNum(n-1);
System.out.println("函数结束,n = "+n+",ret = "+ret);
return ret;
}
}
正序打印
终止条件是当n小于10的时候,他的个位数就是他的整个数字,打印并且return终止即可。
当n大于10,不需借助外力,我可以知道他的个位是多少(n%10)。
但是因为我需要正序打印,所以我要先找到最高位。所以先递归n/10
public class Test5 {
public static void main(String[] args) {
System.out.println("输入一个数并打印每一位");
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
printNum(n);
}
public static void printNum(int n) {
//终止条件
if(n<10) {
System.out.print(n+" ");
return;
}
//先找高位
printNum(n/10);
//高位已经打印过了,直接打印个位即可
System.out.print(n%10+" ");
}
}
逆序就是一位位打印之后再去往高位找,把最后两行代码换位即可。
斐波那契数列
此递归主要用数学归纳法来做,类似的题有青蛙跳台阶及进阶版,可参考
递归——进阶青蛙跳台阶_小白的含金量的博客-CSDN博客
汉诺塔
递归问题——汉诺塔_小白的含金量的博客-CSDN博客
版权归原作者 小白的含金量 所有, 如有侵权,请联系我们删除。