【问题标题】:Recursive Combinations Items of Two Arrays (not null or repeated), using Java两个数组的递归组合项(不为空或重复),使用 Java
【发布时间】:2018-04-12 21:59:03
【问题描述】:

我有两个数组(长度相同),大小是可变的。

做一个最简单的例子,我有两个长度为 3 的数组。

Persons -> P1, P2, P3
Seats -> Sa, Sb, Sc

我需要生成所有组合Cn

如果人P1Sa, 有可能:

  • P2 接受Sb 然后P3 将接受Sc。组合将是P1Sa, P2Sb, P3Sc
  • 或人P2Sc 然后P3 将取Sb。组合将是P1Sa, P2Sc, P3Sb

现在在这里所有可能的组合。

C0 -> P1Sa, P2Sb, P3Sc
C1 -> P1Sa, P2Sc, P3Sb
C2 -> P1Sb, P2Sa, P3Sc
C3 -> P1Sb, P2Sc, P3Sa
C4 -> P1Sc, P2Sa, P3Sb
C5 -> P1Sc, P2Sb, P3Sa

这是我糟糕的设计。

  private void recursiveSeatPerson(String c, List<String> p, List<String> s) {
    if (p.size() > 1) {
      for (int i = 0; i < s.size(); i++) {
        String combination = p.get(0)+s.get(i) + ", " + c;
        System.out.print(combination);

        List<String> new_s = new ArrayList<>();
        for (int index_s = 0; index_s < s.size(); index_s++) {
          if (index_s != i) {
            new_s.add(s.get(i));
          }
        }
        List<String> new_p = new ArrayList<>();
        for (int index_p = 1; index_p < p.size(); index_p++) {
          new_p.add(p.get(index_p));
        }

        recursiveSeatPerson(combination, new_p, new_s);

      }
    } else {
      System.out.print(c + p.get(0)+s.get(0) + " ");
      System.out.println();
    }
  }

这是我的测试。

List<String> persons = Arrays.asList("P1", "P2", "P3");
List<String> seats = Arrays.asList("Sa", "Sb", "Sc");
recursiveSeatPerson("", persons, seats);

这是我的结果:

P1Sa, P2Sa, P1Sa, P2Sa, P1Sa, P3Sa 
P2Sa, P1Sa, P2Sa, P1Sa, P3Sa 
P1Sb, P2Sb, P1Sb, P2Sb, P1Sb, P3Sb 
P2Sb, P1Sb, P2Sb, P1Sb, P3Sb 
P1Sc, P2Sc, P1Sc, P2Sc, P1Sc, P3Sc 
P2Sc, P1Sc, P2Sc, P1Sc, P3Sc 

现在在这一行中发送类似空字符串的参数:

recursiveSeatPerson("", new_p, new_s);

这是糟糕的结果(再次)。

P1Sa, P2Sa, P3Sa 
P2Sa, P3Sa 
P1Sb, P2Sb, P3Sb 
P2Sb, P3Sb 
P1Sc, P2Sc, P3Sc 
P2Sc, P3Sc 

如何解决我的代码?

【问题讨论】:

标签: java algorithm recursion combinatorics


【解决方案1】:

工作代码:

private void recursiveSeatPerson(String snippet, List<String> p, List<String> s) {
  if (p.size() > 1) {
    for (int i = 0; i < s.size(); i++) {
      String combination = snippet + p.get(0) + s.get(i) + ", ";

      List<String> new_s = new ArrayList<>();
      for (int index_s = 0; index_s < s.size(); index_s++) {
        if (index_s != i) {
          new_s.add(s.get(index_s));
        }
      }
      List<String> new_p = new ArrayList<>();
      for (int index_p = 1; index_p < p.size(); index_p++) {
        new_p.add(p.get(index_p));
      }
      recursiveSeatPerson(combination, new_p, new_s);
    }
  } else {
    System.out.println(snippet + p.get(0)+s.get(0) + " ");
  }
}

使用 4 个长度的数组进行测试。

List<String> persons = Arrays.asList("P1", "P2", "P3", "P4");
List<String> seats = Arrays.asList("Sa", "Sb", "Sc", "Sd");
recursiveSeatPerson("", persons, seats);

检查输出:

P1Sa, P2Sb, P3Sc, P4Sd 
P1Sa, P2Sb, P3Sd, P4Sc 
P1Sa, P2Sc, P3Sb, P4Sd 
P1Sa, P2Sc, P3Sd, P4Sb 
P1Sa, P2Sd, P3Sb, P4Sc 
P1Sa, P2Sd, P3Sc, P4Sb 
P1Sb, P2Sa, P3Sc, P4Sd 
P1Sb, P2Sa, P3Sd, P4Sc 
P1Sb, P2Sc, P3Sa, P4Sd 
P1Sb, P2Sc, P3Sd, P4Sa 
P1Sb, P2Sd, P3Sa, P4Sc 
P1Sb, P2Sd, P3Sc, P4Sa 
P1Sc, P2Sa, P3Sb, P4Sd 
P1Sc, P2Sa, P3Sd, P4Sb 
P1Sc, P2Sb, P3Sa, P4Sd 
P1Sc, P2Sb, P3Sd, P4Sa 
P1Sc, P2Sd, P3Sa, P4Sb 
P1Sc, P2Sd, P3Sb, P4Sa 
P1Sd, P2Sa, P3Sb, P4Sc 
P1Sd, P2Sa, P3Sc, P4Sb 
P1Sd, P2Sb, P3Sa, P4Sc 
P1Sd, P2Sb, P3Sc, P4Sa 
P1Sd, P2Sc, P3Sa, P4Sb 
P1Sd, P2Sc, P3Sb, P4Sa 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2017-06-22
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多