当前位置: 首页 > 知识库问答 >
问题:

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

澹台阳秋
2023-03-14

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

例如:

[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++;
    }
}

我正在尝试让它递归调用自己,以便它可以存储组合。我可以得到任何关于代码中缺少的位置或哪个部分的帮助吗?

共有3个答案

暨成双
2023-03-14

使用列表作为递归函数的参数。您可以使用包含除第一项之外的所有内容的新列表从函数本身调用该函数。

宰父君昊
2023-03-14
public static void combination(Object[] array){
         for(int x = 0; x < (1 << array.length); x++){
             System.out.print("[");
             for(int y = 0; y < array.length; y++){
                 if(checkIsOn(x, y){
                    System.out.print(array[y]);
                 }
             }
             System.out.println("]");
         }
    }

    public static boolean checkIsOn(int mast, int position){
         return (mast & (1 << position) > 0);
    }
吴炎彬
2023-03-14

鉴于这是家庭作业,我会试着给你答案的背景。

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

首先假设你的数组中有两个项目。你可以删除第一个项目来给你第一个组合。将剩余的项目添加到第一个项目会给你第二个组合。删除第二个项目会给你第三个组合。添加剩余的项目会给你第四个组合。如果你有["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值命中<code>1</code>时退出。当数组包含一个项时退出,例如:

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

由于JavaAPI的原因,使用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;
  }
}

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

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;
  }
}

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

 类似资料:
  • 问题内容: 我有一个字符串数组列表,希望将所有可能的组合存储到另一个集合中。 例如: 重复并不重要。我现在的代码是: 我试图让它递归调用自己,以便它可以存储组合。我可以在代码中缺少什么地方或哪一部分方面获得任何帮助吗? 问题答案: 鉴于这是家庭作业,因此我将尝试为您提供答案的背景。 解决此问题的关键是使用递归。 首先,假设您的数组中有两个项目。您可以删除第一个项目以得到您的第一个组合。将其余项添加

  • 我想尝试将以下两种方法合二为一: 第一个方法构造一个映射,其中键是<code>String</code>,值是<code<ArrayList</code>。 我想尝试添加第二条信息,即简单的错误消息(方法2)。HashMap不够复杂,无法保存这些信息,但我喜欢它只接受唯一值的方式,而且很容易迭代和传递。 任何建议非常感谢:)

  • 我写了两个方法来查找数组中最小和最大的int,但它们几乎完全相同,所以我觉得应该有一些方法来简化这一点,也许是一种方法? 我不知道如何处理此类问题,所以我很想看到您的回复! 编辑:虽然这个关于如何将算术运算符传递给一个方法的问题和这个关于如何获得Java 8流的最小值和最大值的问题回答了文字编程问题,但我的问题是关于如何处理方法做类似事情的问题,以及一般比较数组的方法。这篇帖子的答案比那些问题的答

  • 我正在尝试实现一个depht first search alogrithm(我的代码可能很糟糕,对不起)。现在我想让这成为一个递归方法,但一旦满足结束条件,我似乎就无法打破它。您在方法中看到的第一个if-条件应该会跳出该方法。当我调试项目时,它到达了返回语句,然后立即跳转到方法的末尾。但是它没有停止整个事情,而是回到了循环并以无限循环进行。 我试图自己解决这个问题,但没有成功,于是我开始在网上搜索

  • 排列 下一个排列 LeetCode - 31. 下一个排列 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5

  • 本文向大家介绍Java排列组合字符串的方法,包括了Java排列组合字符串的方法的使用技巧和注意事项,需要的朋友参考一下 例如 输入“abc”,打印所有可能出现的组合情况,并且消除重复值。 所谓排列组合如下: 排列组合,字符串:abc bca acb abc cba bac cab 排列组合个数:6 实现代码(结合Java8 lambda表达式实现) 如有更简洁的代码实现,请不要吝啬,贴出来分享下。