Java0620-node

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 实现步骤

  1. 通项公式:f(n) = f(n-1) + n
  2. 特殊的情况:f(1) = 1 —— 即程序的出口
  3. 代码实现
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一起使用

定义的时候就要赋初始值或在静态代码里赋初值
静态代码块只会调用一次,主要是给类属性赋初值、加载配置属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值