方法就是一个代码片段. 类似于 C 语言中的 “函数”。
// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
注意事项
【方法调用过程】 调用方法—>传递参数—>找到方法地址—>执行被调方法的方法体—>被调方法结束返回—>回到主调方法继续往下执行
例1:: 计算 1! + 2! + 3! + 4! + 5!
实参的值永远都是拷贝到形参中,形参和实参本质是两个实体,故改变形参实参不会随之改变。那么就有同学会问,Java没有C语言中的地址,那么它是如何改变的呢?这就要说到另一个知识点“引用”了,具体我们以后再学。
对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用
方法的返回值是可选的. 有些时候可以没有的,没有时返回值类型必须写成void
在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。 注意:
方法签名即:经过编译器编译修改过之后方法最终的名字。具体方式:方法全路径名+参数列表+返回值类型,构成方法完整的名字。
一个方法在执行过程中调用自身, 就称为 “递归”. 递归的必要条件:
例2:打印1234 各项
例3:求斐波那契数列的第n项 方法一:迭代实现
方法2:递归实现
但是循环的效率远大于递归!
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。【百度百科】
…
由以上可得每移动n个需要(2^n)-1步骤。
我们可以发现,要想移动所有的盘子,可以逆着思路推理。终止条件是将最底下一个盘子从起始位置移动到目标位置。而上面n-1个盘子是可以借助目标位置先放在中转位置上面。再将最下面一个盘子放在目标位置上,然后将n-1个盘子借助起始位置放在目标位置上。如此递归下去…
于是我们可以写出以下代码:
运行一下:(3的情况)
可以对比我们刚才推理的结果,答案是一样的。
/**
* pos1 起始位置
* pos2 中转位置
* pos3 目标位置
*/
public static void hanio(int n,char pos1,char pos2,char pos3){
if (n == 1){
move(pos1,pos3);//最后一步都是把最底下的盘子从起始位置(pos1)转移到目标位置(pos3)
return;
}
hanio(n-1,pos1,pos3,pos2);//将n-1个盘子从起始位置(pos1)借助中转位置(pos3)移动到目标位置(pos2)
move(pos1,pos3);//把最底下的盘子从起始位置移到目标位置
hanio(n-1,pos2,pos1,pos3);//将n-1个盘子从起始位置(pos2)借助中转位置(pos1)移动到目标位置(pos3)
}
/**
*
* @param pos1 起始位置
* @param pos2 目标位置
*/
public static void move(char pos1,char pos2){
System.out.print(pos1+"->"+pos2+" ");//模拟鼠标实现
}
public static void main(String[] args) {
hanio(3,'A','B','C');
}