最近在学递归有两个问题困扰了我很久,
问题:递归引用传递的问题
贴个代码说事
public static List<List<Integer>> threeSum(int[] nums,int counter,List<List<Integer>> results,List<Integer> result) {
//递归
}
就拿这个做例子,我发现比如说数组原始内容是{-1, 0, 1, 2, -1, -4},递归做的是找出三个元素使得a+b+c=0,比如说我在里面有循环,当我从第三次次递归回调到第二次递归时,数组里的变量也会回退到第二次的情况,但是为什么List列表不会回退到第二次呢,而是不管递归了多少次他都会一直往下记录?
请注意,对于引用对象来说,它们无论是几个变量名,都指向同一个对象。
你有两个操作:
(1)将一个引用指向另一个对象,比如
list = new List...
此时再操作的list和原来的没有任何关系了。并且函数实参修改引用
不改变形参指向的对象。
(2)通过引用修改对象,比如
list.add(...)
此时通过任何一个引用添加或者修改对象,别的引用访问的对象也会改变,因为只有一个对象,这个修改的不是引用而是对象本身
。
1 你传的4个参数:
int[] nums,--传址,
int counter, --传值。只有这一个参数才是调用结束后,不会影响到调用它的变量。
List> results,,--传址
List result,--传址
传址只是把对象的地址传给变量,函数内对这个对象进行操作,就会改变这个对象本身的。这个你应该清楚吧。
2 你第一层递归结束后,counter的值消失,与第二层递归计算无关了。
但, nums所指向数组里的元素值如果有改变的话,是会成为改变后的值留下的。 results和 result所指向集合里的元素值有改变或者元素个数有增加删除也是会留下的。
3 你说数组没变应该是你没改变数组内元素的值吧。或者你每次递归都new了一个新的数组对象出来。新new出来的数组对象是和别的调用无关了。