-
二、方法的重载
-
- 1、重载所能解决的问题
-
三、递归的概念
-
- 1、递归的概念
-
2、递归的练习
-
- 1)、汉诺塔问题
-
2)、青蛙跳台阶
-
3)、青蛙跳台阶(进阶)(递归->动态规划)
![ima
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
ge-20210731174509032](https://img-blog.csdnimg.cn/img_convert/f60e5942964052bcbaa120a41b44dd0b.png)
1、方法的概念
Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function)。
对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号“{}”当中,并且起一个名字。使用代码的时候,直接找到名字调用即可。
方法存在的意义:
-
能够使代码模块化,使代码的结构更加清晰。
-
当重复使用一个功能(代码)时,只需要写出方法名进行调用,避免相同代码重复累赘。
-
让代码更好理解更简单。
接下来看方法的结构:
访问修饰限定符:自由选择,告诉编译器如何调用该方法。定义了该方法的访问类型。
**静态static:**当调用的主函数是static时,被调用的函数需要为static的。例如:java中,main方法直接调用add方法。此时的add方法需要static修饰。
返回值类型 :方法可能会返回值。return Value Type 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,return Value Type 是关键字void。
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
方法名(函数名):是方法的实际名称。方法名和参数表共同构成方法签名。
方法体:方法体包含具体的语句,定义该方法的功能。
public class Main {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = add(a, b); //在main方法中,直接调用其他方法,必须为static的方法
}
public static int add(int num1, int num2) {
return num1 + num2;
}
}
2、实参形参的关系
实参:在方法中,实际传递的数值就是实际参数。比如上面的main函数中, int c = add(a, b); 这里的a和b就是实际参数,称为实参。
形参:在被调用的方法里,由实参传递过来的数值,就称为形式参数。形参是实参的一份临时拷贝。也就是说,main函数传递的a和b,与add方法中的a和b,虽然都是10和20(上面代码中),但是二者并不是来自同一块内存空间:如下图所示:
1、重载所能解决的问题
在我们平常写代码中,少不了数据的加减乘除。也少不了对不同类型的数据进行四则运算。假设:我们就写了上面的代码(add方法),我们用浮点数(小数)调用add方法,会有什么情况发生?
此时大家就会想,我重新写一个double类型的方法不就行了吗。
没错,就是再次写一个double类型的add就行啦。在C语言中,我们写的函数(方法),不能够写重命的。比如,我写两个add的函数。函数名就是叫add。一模一样,在C语言中是不允许的。
但是在java中,这是可以。也就是这节所讲的 方法重载。
根据形参的类型和形参的个数,去寻找被调用的方法。
上面的代码,分别调用了add方法,虽然都叫add。但是形参类型不一样。所以是两个不同的方法。这就叫重载。
重载的规则
-
方法名相同
-
方法的参数不同。(形参类型不同,个数不同)
-
方法的返回值类型不影响重载
注:当方法的方法名相同,参数相同,但返回值类型不同的时候,这不构成重载。
1、递归的概念
一个方法在自己调用自己时,就称为“递归”。
当一个大问题,是由若干个小问题,并且这些小问题的解决方法,都是一样的。这样的问题,很大可能就能用递归去解决。
递归相当于数学上的**“数学归纳法**”,有一个起始条件, 然后有一个递推公式
例如,我们求N!
起始条件: N= 1的时候, N!为1. 这个起始条件相当于递归的结束条件.
递归公式:求N!,直接不好求,可以把问题转换成N!=> N * (N-1)!
例如代码:
public class Main {
public static void main(String[] args) {
int n = 5; //求5的阶乘
System.out.println(fact(n));
}
public static int fact (int n) {
if (n == 1) { //递归结束的条件
return 1;
}
return n * fact(n - 1); //例如5! = 5 * 4! -》 5 * 4 * 3! ,一直递归到1的阶乘,就结束
}
}
2、递归的练习
1)、汉诺塔问题
汉诺塔游戏(7K7K小游戏链接)。在开始讲解之前,大家还是先去玩一玩汉诺塔游戏,看看是什么规则。更容易的理解下面的代码。
汉诺塔游戏规则:
现有三根柱子,我们分别叫 left, mid,right。现在有3个圆盘left柱子上,3个圆盘的大小关系为:从上往下,圆盘越来越大。
每次只能取出一个圆盘,并且圆盘在取和放的时候,必须在这三根柱子上完成。不能取出来放到其他地方。
且,大的圆盘不能放到小的圆盘上。
问,怎么移动圆盘,让圆盘从left柱子,移动到right柱子上。
情况一:我们先从1个圆盘举例说明, 我们直接从left柱,移动到right柱即可
情况二: 2个圆盘的情况
情况三: 3个圆盘的情况
这就是大致的思路:
-
先将N - 1层移动到mid柱子,给最下面那一层让路。
-
N - 1层移开之后,路就让出来了。此时移动第N层圆盘即可。
-
此时第一步移动的 N- 1层圆盘 还在mid柱子上,现在就是从 mid柱子 移动到 right柱子上。
不要去深究每一步的细节,抓好大致的思路,确定好递归终止的条件。宏观的去想这个问题,就能够很好地抓到问题的本质。
public class Main {
public static void main(String[] args) {
//汉诺塔
int n = 3;
hanoiTower(n, “left”, “right”, “mid”);
}
public static void hanoiTower(int n, String from, String to, String mid) {
if (n == 1) {
System.out.println("move 1 from " + from + " to " + to);
return; //记得返回,终止递归
}
hanoiTower(n - 1, from, mid, to); //图1 -> 图2
System.out.println("move " + n + " from " + from + " to " + to); //图2 -> 图3
hanoiTower(n - 1, mid, to, from); //图3 -> 图4
}
}
2)、青蛙跳台阶
情况一:一步台阶 只能跳一次,就跳完了; 1种
情况二:两步台阶 题意是,青蛙一次可以跳一步台阶,也可以跳两步台阶。所以情况二的跳法是 2 种
情况三:三步台阶
现在摆在我面前的问题就是。我要么跳一步台阶。我要么跳两步台阶。
不对,是摆在青蛙面前的问题!!!口误口误!
假设1:青蛙跳一步台阶后,还剩两个台阶没跳。此时是不是又回到了两层台阶的决策问题(上文情况二);
假设2:青蛙跳两步台阶后,还剩一个台阶没跳。此时是不是又回到了一层台阶的决策问题(上文情况一);