java 在下面的代码中,如何使用递归来保留局部变量或函数参数以前的值?

gzszwxb4  于 4个月前  发布在  Java
关注(0)|答案(1)|浏览(52)
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是如何保存旧值的。据我所知,当一个方法是递归的时,它会创建新的参数示例,当方法返回时,它们保存的值将消失,除非我们返回它们的值。在这种情况下,我什么也不返回。那么它是如何保存旧值的呢?
帮帮忙。谢谢

uajslkp6

uajslkp61#

这是因为变量ans是对列表的引用。当你向列表添加新元素并进行递归调用时,引用是堆栈的一部分,而不是实际对象(List<String>)。因此,你修改的是堆上的实际对象。
这与将List<String>传递给方法并在方法中的列表中添加新元素相同。当方法调用返回给调用者时,列表中的更改将对调用者可见。

相关问题