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]
型
现在我的问题是这个Listans是如何保存旧值的。据我所知,当一个方法是递归的时,它会创建新的参数示例,当方法返回时,它们保存的值将消失,除非我们返回它们的值。在这种情况下,我什么也不返回。那么它是如何保存旧值的呢?
帮帮忙。谢谢
1条答案
按热度按时间uajslkp61#
这是因为变量
ans
是对列表的引用。当你向列表添加新元素并进行递归调用时,引用是堆栈的一部分,而不是实际对象(List<String>
)。因此,你修改的是堆上的实际对象。这与将
List<String>
传递给方法并在方法中的列表中添加新元素相同。当方法调用返回给调用者时,列表中的更改将对调用者可见。