public static void main (String[] args) {
String str = "Test";
List<String> res = new ArrayList<String>();
pastValues(str, 0, "", res);
//System.out.println("Ans:::"+res);
}
public static void pastValues(String str, int index, String curr, List<String> ans){
if(index == str.length()){
return;
}
pastValues(str, index + 1, curr + str.charAt(index), ans);
System.out.println("Before:::"+ans);
ans.add(curr + str.charAt(index));
System.out.println("After:::"+ans);
}
输出是
Before:::[]
After:::[Test]
Before:::[Test]
After:::[Test, Tes]
Before:::[Test, Tes]
After:::[Test, Tes, Te]
Before:::[Test, Tes, Te]
After:::[Test, Tes, Te, T]
现在我的问题是这个列表ans如何保留旧值。据我所知,当一个方法是递归的时,它将创建新的参数实例,并且当方法返回时,它们保留的值将消失,除非我们返回它们的值。在这种情况下,我什么也不返回。那么它是如何保留旧价值观的呢?
请帮忙。谢谢
这是因为变量
ans
是对列表的引用。当您向列表添加新元素并进行递归调用时,引用是堆栈的一部分,而不是实际对象 (List<String>
)。因此,您正在修改堆上的实际对象。
这与将
List<String>
传递给方法并在方法中将新元素添加到列表中相同。当方法调用返回给调用者时,列表中所做的更改将对调用者可见。