再帰関数は、リストの動的な数の組み合わせを取得します

kumaran Ragunathan:

私は、リストの動的な番号からのすべてのとりうる組み合わせを取得するために再帰関数を記述しようとしています。たとえば、私は3つのリストを持っている場合

List 1 : {A,B}
List 2 : {B,C}
List 3 : {D}

私はの構造で出力を維持したいと考えたら、出力の各要素が発生したとしても

List<List<List<elements>>>

私の予想される出力は次のようになります

L1 : A, L2 : B, L3 : D
L1 : A, L2 : C, L3 : D
L1 : B, L2 : B, L3 : D
L1 : B, L2 : C, L3 : D

ここでは、リストの数を動的に変更することができます。だから私は組み合わせを見つけるために、ネストされたループの動的な番号が必要です。

ここで私は何をしようとしています。ちょうど私のひどいコードを無視します。

public List<List<List<elements>>> combinations(int depth, List<List<elements>> allLists,List<List<List<elements>>> answerList){

if(depth==allList.size())
 return answerList
 }
else{ 
 for(List<element> e : answerList){
    for(int j=0; j<e.size();j++){
      answerList.get(depth).get(j).add(allList.get(depth).get(j));
combinations (depth+1,allLists,answerList)
}
}
}

私が間違ってやっているところに私を助けてください?

EDIT:

私の考えはように一緒にすべての組み合わせを維持することです

{A}

その答えで最も深いリストになります

{L1、L2、L3}

リストの2番目のレベルになります。

{L1、L2、L3}、{L1、L2、L3}

外のリストになります。だから、リストの数は、ここで問題doest。上記のすべての構造によってカバーされます。上記構成での私の最終的な出力は以下のとおりであります

 {
   {
     {A},
     {B},
     {D}
   },
   {
     {A},
     {C},
     {D}
   },
   {
     {B},
     {B},
     {D}
   },
   {
     {B},
     {C},
     {D}
   }
 }
マルチンズコウスキー:

あなたは、現在のレベルまで構築された状態を含む変数を維持するかなり一般的再帰的なパターンを、必要とします。ここではあなたのためにいくつかのコードです。

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;

public class Main 
{
  public static void recurse(int depth,
                      List<List<String>> current,
                      List<List<List<String>>> result,
                      List<List<String>> lists)
  {
    if (depth == lists.size()) {
      // Copy the list to the result
      result.add(new ArrayList<List<String>>(current));
      return;
    }
    // Iterate over the current-depth list
    List<String> list = lists.get(depth);
    for (String str: list) {
      List<String> elem = Arrays.asList(str);
      current.add(elem);   // Add the next element to the list
      recurse(depth + 1, current, result, lists);
      current.remove(depth);  // Clean up this element
    }
  }

  public static List<List<List<String>>> combinations(List<List<String>> allLists) 
  {
      // We'll fill it in
      List<List<List<String>>> result = new ArrayList<>();

      // Current, partial row in the final result
      List<List<String>> current = new ArrayList<>();

      recurse(0, current, result, allLists);

      return result;
  }

  public static void main(String[] args) {

    System.out.println("Hello World!");

    List<String> list1 = Arrays.asList("A", "B");
    List<String> list2 = Arrays.asList("B", "C", "E");
    List<String> list3 = Arrays.asList("D", "X");

    List<List<String>> allLists = Arrays.asList(list1, list2, list3);

    List<List<List<String>>> result = combinations(allLists);

    // Print
    for (List<List<String>> list: result) {
      System.out.print("{ ");
      for (List<String> elem: list)
        System.out.print("{" + elem.get(0) + "} ");
      System.out.println("}");
    }
  }
}

@dasblinkenlightが提案のようにところで、あなたは、ビットリストの第3レベルずにそれを簡素化することができます

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=212529&siteId=1