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

问题描述 投票:0回答:1
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如何保留旧值。据我所知,当一个方法是递归的时,它将创建新的参数实例,并且当方法返回时,它们保留的值将消失,除非我们返回它们的值。在这种情况下,我什么也不返回。那么它是如何保留旧价值观的呢?

请帮忙。谢谢

java recursion memory methods stack
1个回答
0
投票

这是因为变量

ans
是对列表的引用。当您向列表添加新元素并进行递归调用时,引用是堆栈的一部分,而不是实际对象 (
List<String>
)。因此,您正在修改堆上的实际对象。

这与将

List<String>
传递给方法并在方法中将新元素添加到列表中相同。当方法调用返回给调用者时,列表中所做的更改将对调用者可见。

© www.soinside.com 2019 - 2024. All rights reserved.