递归调用,为什么是这个输出

阿涛爱学习 2020-02-02 08:05:03
Node不是引用吗,当找到返回时,为什么没把传入的n带出来,我的理解是当找到val==4时,会把n带会上层,输出的应该全是Node[val=4]
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿涛爱学习 2020-02-03
  • 打赏
  • 举报
回复
引用 5 楼 三仙半的回复:
个人觉得这样的问题提就不该问,而应该在“n1.test(n)”那里打个断点,单步调试进入看看,不仅可以知道为啥是现在的输出,还能练一练debug的方法,对于一个程序员来说,不会debug简直不可想象。
你应该是没明白我的意思,我的问题并不是递归,而且java中的引用数据类型,不知道您知不知道,在java中,除了基本数据类型和String其它的都是引用数据类型,我想问的是,传入的Node应该能带出n4?
阿涛爱学习 2020-02-03
  • 打赏
  • 举报
回复
当最后val=4时,return 传入的node已经被赋值为n4了,在java中,不是除了基本数据类型和String外,其它的都是引用数据类型吗?那么node应该能够带回上层递归?
阿涛爱学习 2020-02-03
  • 打赏
  • 举报
回复
引用 1 楼 心怀啊的回复:
test方法的返回值类型为空
你应该是没明白我的意思,在java中,除了基本数据类型和String其它的都是引用数据类型,我想问的是,传入的Node应该能带出n4啊?
三仙半 2020-02-03
  • 打赏
  • 举报
回复
个人觉得这样的问题提就不该问,而应该在“n1.test(n)”那里打个断点,单步调试进入看看,不仅可以知道为啥是现在的输出,还能练一练debug的方法,对于一个程序员来说,不会debug简直不可想象。
敲出亿行bug 2020-02-03
  • 打赏
  • 举报
回复
你的结果成立后直接return跳出来了(你的方法无返回类型) 无法执行输出语句
阿涛爱学习 2020-02-03
  • 打赏
  • 举报
回复
引用 9 楼 qybao的回复:
这种问题都是初学者容易犯的错误
方法内改变引用的指向不影响方法外引用的指向
相当于
String n1 = “abc”; //这个代表方法外的n
String n2 = n1; //这个代表方法内的n
n2 = “efg”; //这个代表你方法内的n=this,此时你觉得n1会变为"efg"吗?
你要知道,方法外的n和方法内的n是不同方法栈的两个变量,也就是它们本身的内存地址不一样,只是参数传递的时候,把方法外的变量的内存信息拷贝给了方法内的变量。方法外的变量的内存如果保存了一个对象的地址,那么拷贝到方法内后方法内的变量的内存也保存的同一个对象的地址,这样修改方法内的变量的属性,同样也能影响方法外的变量(因为它们指向同一对象)。但是如果是改变方法内的变量的指向,也就是n=xxx用这样的赋值语句,那么它不再指向和方法外的变量的指向一样的对象(也就是方法内的变量指向了别的对象),那它和方法外的变量就不再有关系,所以不能影响方法外的变量。
我好像明白了,受教了
qybao 2020-02-03
  • 打赏
  • 举报
回复
这种问题都是初学者容易犯的错误
方法内改变引用的指向不影响方法外引用的指向
相当于
String n1 = “abc”; //这个代表方法外的n
String n2 = n1; //这个代表方法内的n
n2 = “efg”; //这个代表你方法内的n=this,此时你觉得n1会变为"efg"吗?
你要知道,方法外的n和方法内的n是不同方法栈的两个变量,也就是它们本身的内存地址不一样,只是参数传递的时候,把方法外的变量的内存信息拷贝给了方法内的变量。方法外的变量的内存如果保存了一个对象的地址,那么拷贝到方法内后方法内的变量的内存也保存的同一个对象的地址,这样修改方法内的变量的属性,同样也能影响方法外的变量(因为它们指向同一对象)。但是如果是改变方法内的变量的指向,也就是n=xxx用这样的赋值语句,那么它不再指向和方法外的变量的指向一样的对象(也就是方法内的变量指向了别的对象),那它和方法外的变量就不再有关系,所以不能影响方法外的变量。


Nonoas 2020-02-02
  • 打赏
  • 举报
回复
public class Node {
int val;
Node next;
public Node(int val) {
this.val=val;
next=null;
}

public void test(Node n) {
n=n.next;
}

@Override
public String toString() {
return "[val:"+val+"]";
}

public static void main(String[] args) {
Node n1=new Node(1);
Node n2=new Node(2);

n1.next=n2;
n1.test(n1);

System.out.println(n1);
}
楼主调试一下这个程序就知道了
}
Nonoas 2020-02-02
  • 打赏
  • 举报
回复
递归体输出的顺序是最内到最外,也就是n3,n2,n1
Nonoas 2020-02-02
  • 打赏
  • 举报
回复
你这个不就相当于把n1赋值给n吗
心怀啊 2020-02-02
  • 打赏
  • 举报
回复
test方法的返回值类型为空

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧