gpt4 book ai didi

Java函数变量冲突

转载 作者:行者123 更新时间:2023-12-02 09:11:38 24 4
gpt4 key购买 nike

import java.util.*;

class Solution {
public static List<String> subsets(String s){
ArrayList<String> result = new ArrayList<String>();
StringBuilder current = new StringBuilder();
helper(s, 0, result, current);
return result;
}
public static void helper(String s, int position, List<String> result, StringBuilder current){
if(position >= s.length()){
result.add(current.toString());
return;
}
helper(s, position + 1, result, current.append(s.charAt(position)));
current.delete(current.length() - 1, current.length());
helper(s, position + 1, result, current);

}
}

上面的函数尝试递归地查找字符串的所有子序列。我的问题是关于以下代码:

        helper(s, position + 1, result, current.append(s.charAt(position)));
current.delete(current.length() - 1, current.length());
helper(s, position + 1, result, current);

当我第一次调用 helper 并将 current.append(s.charAt(position))) 传递给它时。据说Java正在将current的“位置值”传递给函数,并且在helper中对current所做的任何更改都会影响current(因为即使Java是按值传递的,当您调用对象的方法时,它也会影响初始对象)。因此,我假设第一个助手中发生的更改会对当前产生影响,从而导致困惑。但情况似乎并非如此,因为子集返回正确的结果。我的推理哪一部分是错误的?

最佳答案

您的推理似乎缺少的是 current.delete()调用正在撤消 current.append() 的效果.

如果您提取append(),这一点会更加明显。调用:

current.append(s.charAt(position)); // append character
helper(s, position + 1, result, current);
current.delete(current.length() - 1, current.length()); // remove appended character
helper(s, position + 1, result, current);

因此,代码调用自身两次,一次附加了字符,一次没有附加了字符。

请注意,append()delete()返回 StringBuilder实例本身,为了允许方法链接,这意味着代码可以压缩如下:

helper(s, position + 1, result, current.append(s.charAt(position)));
helper(s, position + 1, result, current.delete(current.length() - 1, current.length()));

它只会让代码更难理解,所以你不应该这样做。问题中的代码为 append() 执行此操作。 ,但不适用于delete() ,这更加令人困惑。

正如您在上面第一个片段的代码中看到的,所有 helper 的调用s 将具有相同对象, result ,和current 。只有position值发生变化,在递归调用堆栈中越往下增加 1。

关于Java函数变量冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59367689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com