Java0620-node
目录
1 递归
1.1 概念
自己调用自己
可以解决循环问题,可能造成死循环,引发
- StackOverflowError
栈溢出
1.2 思想
把一个大的问题,转换成一个跟它相似,但规模更小的小问题
1.3 案例
求和:1+2+3+4+……+n
f(n) = 1+2+3+4+……+n
f(n) = f(n-1) + n
f(n-1) = f(n-2) + n-2
……
f(2) = f(1) + 2
f(1) = 1
从上往下简化过程,为递
从下往上返回结果,为归
1.4 实现步骤
- 通项公式:f(n) = f(n-1) + n
- 特殊的情况:f(1) = 1 —— 即程序的出口
- 代码实现
public class Test1{
public int sum(int n){
if(n==1){
return 1;
}else {
return sum(n-1)+n;
}
}
public void main(String[] args){
Test1 t = new Test1();
System.out.println((t.sum(5)));
}
}
1.5 斐波那契数列(兔子繁殖问题)
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。
如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
public class Test01 {
//1对兔子
//第一个月:1对
//第二个月:1对
//第三个月:2对(新生1):
//第四个月:3对(新生2):
//第五个月:5对(新生3,新生4):
//第六个月:8对(新生5,新生6,新生7):
public int num(int n) {
if(n==1||n==2) {
return 1;
}else {
return num(n-1)+num(n-2);
}
}
public void print() {
for(int i=1;i<=12;i++) {
System.out.println(num(i));
}
}
public static void main(String[] args) {
Test01 t = new Test01();
t.print();
}
}
1.6 汉诺塔
有三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
需求:把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
/**
* 输出移动顺序
*/
//1片:从a——>c
//2片:第一片:从a——>b
// 第二片:从a——>c
// 第一片:从b——>c
//3片:前两片:从a,借助c,移动至b
// 第三片:从a——>c
// 前两片:从b,借助a,移动至c
//1片,1次(2^1-1)
//2片,3次(2^2-1)
//3片,7次(2^3-1)
public class Test02 {
int count = 0;//记录移动次数
//从a柱,借助b,移动至c柱
public int moveHino(int n,String a,String b,String c) {
if(n==1) {
System.out.println(a+"——>"+c);
}else {
moveHino(n-1,a,c,b);
System.out.println(a+"——>"+c);
moveHino(n-1,b,a,c);
}
count++;
return count;
}
public static void main(String[] args) {
Test02 t = new Test02();
t.moveHino(3, "a", "b", "c");
}
}
2 构造方法
2.1 概念
方法名与类名一样
不要写返回值类型
返回当前类的类型
没有显示写出构造方法时,系统会默认分配
如果显示写出构造方法时,系统不会默认分配
使用new关键字调用
作用:给属性赋初始值
支持重载
构造方法可以调用普通方法,普通方法不可以调用构造方法
构造方法直接可以互相调用,可以通过this关键字,this(参数列表),必须位于第一行
2.2 this关键字
代表当前对象
this.属性
this.方法
this(参数列表) 调用构造方法
2.3 static 关键字
静态的
可以用来修饰属性、方法、代码块
不可以来修饰类、局部变量
2.3.1 使用static修饰的区别
静态(类方法) | 非静态(实例方法) | |
---|---|---|
称呼 | 静态,类属性 | 实例属性,实例方法 |
所属 | 类,该类的所有对象 | 对象,实例 |
调用 | 对象名.属性 | 对象名.属性 |
对象名.方法() | 对象名.方法() | |
类名.属性 | ||
类名.方法() | ||
存储 | 只存储一份(静态区 ) | 堆,不同的对象有不同的空间 |
生命周期 | 类加载——>JVM停止 | 对象创建——>对象销毁 |
2.4 当创建一个对象的时候,都做了什么
执行顺序
类属性、静态代码块(静态的东西,谁写在前,先执行谁)
——>实例属性
——>构造方法
结论:类成员先于实例成员
类方法、实例方法:调用时才会执行
类方法中,不能调用实例成员的属性和方法(若需调用,先创建实例对象,才能调用)
实例方法中,可以使用实例成员的属性和方法,也可以调用类属性和类方法
2.5 static和final一起使用
定义的时候就要赋初始值或在静态代码里赋初值
静态代码块只会调用一次,主要是给类属性赋初值、加载配置属性