gpt4 book ai didi

java - 如何使这种组合/排列方法递归?

转载 作者:行者123 更新时间:2023-12-01 06:54:51 24 4
gpt4 key购买 nike

我有一个字符串数组列表,希望将所有可能的组合存储到另一个集合中。

例如:

[air,bus,car]
->
[air]
[bus]
[car]
[air,bus]
[air,car]
[bus,air]
[bus,car]
[car,air]
[car,bus]
[air,bus,car]
[air,car,bus]
...
[car,bus,air]

重复并不重要。我现在的代码是:

public ArrayList<String> comb(ArrayList<String> wrds, ArrayList<String> str, int size)
{
ArrayList<String> s = new ArrayList<String>();
s.addAll(str);
if(size != a1.size())
{
Iterator e = a1.iterator();
while(e.hasNext())
{
s.add((String)e.next());
}
size++;
}
}

我试图让它递归地调用自身,以便它可以存储组合。我可以获得有关代码中缺少的位置或部分的帮助吗?

最佳答案

由于这是家庭作业,我会尽力向您提供答案的背景。

解决这个问题的关键是使用递归。

首先假设您的数组中有两个项目。您可以删除第一个项目来获得第一个组合。将剩余的项目添加到第一个项目中即可得到第二个组合。删除第二个项目就会得到第三个组合。添加剩余的项目将得到第四种组合。如果你有[“air”,“bus”],它会是这样的:

["air"]
["air", "bus"]
["bus"]
["bus", "air"]

返回的方法可能如下所示:

String[][] combinations(String[] strings)

需要注意的重要事项是,可以将包含单个字符串的数组传递给此方法,并且它可以返回包含其中包含单个字符串的数组的数组。

这个问题有点复杂,因为你必须记录字符串组合,所以在我们解决这个问题之前,了解递归很重要。

假设您想要编写一个乘法方法,将两个数字相乘,但您只能使用加法和减法。您可以编写一个递归函数,将其中一个数字添加到自身,直到另一个数字达到退出条件,例如:

public int multiply(int value1, int value2) 
{
if (value1 > 1)
{
int remaining = value1 - 1;
return value2 + multiply(remaining, value2);
}
else
{
return value2;
}
}

您可以对数组执行相同的操作,只是当 a 值达到 1 时退出,当数组包含一项时退出,例如:

public String[][] combinations(String[] strings) 
{
if (strings.length > 1)
{
...
}
else
{
return new String[][]{strings};
}
}

由于 Java API 的原因,使用 java.util.List 比使用数组要容易得多,因此您需要类似的东西:

public List<List<String>> combinations(List<String> strings) 
{
if (strings.size()> 1)
{
...
}
else
{
List<List<String>> result = new ArrayList<List<String>>();
result.add(strings);
return result;
}
}

现在,... 是最重要的部分。您需要保留一个将作为结果的列表列表,并迭代字符串。对于每个字符串,您可以将该字符串添加到结果中,然后需要创建一个减去当前字符串的子列表,您可以使用该子列表再次调用 combinations 方法,迭代结果添加每个列表包含的当前字符串。在代码中它看起来像这样:

public List<List<String>> combinations(List<String> strings) 
{
if (strings.size() > 1)
{
List<List<String>> result = new ArrayList<List<String>>();

for (String str : strings)
{
List<String> subStrings = new ArrayList<String>(strings);
subStrings.remove(str);

result.add(new ArrayList<String>(Arrays.asList(str)));

for (List<String> combinations : combinations(subStrings))
{
combinations.add(str);
result.add(combinations);
}
}

return result;
}
else
{
List<List<String>> result = new ArrayList<List<String>>();
result.add(new ArrayList<String>(strings));
return result;
}
}

总之,您所做的是将字符串列表减少为单个项目,然后将其与前面的项目组合,以在线程返回调用堆栈时生成所有可能的组合。

关于java - 如何使这种组合/排列方法递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14483781/

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