递归问题,方法传参(以对象为参数)

递归问题

递归,本质上是对自己方法的反复调用。

public class recursion01 {
public static void main(String[] args) {
System.out.println();
Tools tos = new Tools();
tos.test(30);
System.out.println(tos.factorial(5));
}
}

class Tools {
int numx=0;
//单纯的实现递归
public void test(int n) {
if (n>2) {
numx += 1;
test(n-1);
}
// numx是最终数没有变化的原因:
// 递归时就在不断的累加上去,累加到顶层再一层一层的打印下来
// 导致最终只有n在变化而numx没有变化
System.out.println("n="+n+"numx="+numx);
}
// 实现n的阶乘
/*
差不多是这样子的:
f(5) = f(4)*5
= f(f(3)*4)*5
= f(f(f(2)*3)*4)*5
= f(f(f(f(1)*2)*3)*4)*5
当f(1)=1时,有:
f(5) = 5*4*3*2*1

数学的表示差不多就这样
*/
public int factorial (int n) {
if (n==1) {
// 当n=1时,返回整形1
// 相当于f(1)=1
return 1;
}else {
// 当n不等于1时,返回的是f(n-1)*n
// 相当于是f(5)=f(4)*5
return factorial(n-1)*n;
}
}
}

test与阶乘的结果集:
"test与阶乘的结果集"

下面引自老师的内存分析法:

调用test时
"调用test时"

调用factorial时
"调用factorial时"

方法传参(以对象为参数)

上课时听到的,方法调用对象作为参数时,会调用对象的地址,修改它的属性值时会影响到原先的属性值。但如果在引入对象作为参数时,将引入且创建出来的当前对象的地址指向别处时,当前对象的修改不会影响到原来被引入的对象。

public class word {
public static void main(String[] args) {
// 使用Person创建一个对象,地址存入堆空间
Person p = new Person();
// 给对象的属性赋值
p.name = "SYW";
p.age = 19;
System.out.println("未被改变的对象属性:"+p.name+" "+p.age);
// 使用Temporary类创建一个对象
Temporary tmp = new Temporary();
// 把对象p作为参数进行传入
// (注意:对象是引用数据类型)
// 此时传入的是对象p的地址,且传给的是形参的p1
tmp.force(p);
System.out.println("已被改变的对象属性:"+p.name+" "+p.age);
}
}
// 创建一个Person类
class Person {
// 属性
String name;
int age;
}
// 创建一个Temporary对象
class Temporary {
// 形参p1,自创建一个Person对象,并且对象的地址指向传入的实参p
public void force(Person p1) {
// 因为p1指向的是实参p的内存地址拷贝
// 当对其属性值进行替换时,会影响到实参p
p1.name = "Python";
p1.age = 133;

/*
什么情况不影响?实参p
1.首先,得明确一点:p1仅仅是从实参p拷贝了一份地址过来
简单来说就是:两者是分开声明的,拷贝的地址可以被替换掉

假设将p1置空:
p1=null;
那么p有可能被置空吗?
答案是否定的。
p1置空仅仅是p1没有调用那块地址而已。

假如你new了个新的Person:
Person p1 = new Person();
那么你将直接指向一个新的地址,抛弃原本拷贝的地址。

说白了,当p1抛弃引用实参p的地址拷贝时,形参p1修改成任何模样
都不会影响到实参p
*/
}
}

"实验结果集"