【问题标题】:Java use result from recursive void function, add each to list and return in another functionJava使用递归void函数的结果,将每个添加到列表并在另一个函数中返回
【发布时间】:2016-04-11 17:30:43
【问题描述】:

我正在使用我偶然发现的递归算法的修改版本来返回一组数据的所有组合。例如:如果数据集恰好是 ["ABCD", "ACDEF", "ABDFG", "BDEF", "CGEGD"],我希望在列表中包含以下内容,即每个唯一元素都与指定长度的另一个唯一元素。

A B C ,A B D ,A B E ,A B F ,A B G ,A C D ,A C E ,A C F ,A C G ,A D E ,A D F,A D G ,A E F ,A E G ,A F G ,B C D ,B C E ,B C F ,B C G ,B D E ,B E F ,B E G ,B F G ,C D E ,C D F ,C D G ,C E F ,C E G ,C F G ,D E F ,D E G ,D F G ,E F G

到目前为止,这是我的课程:

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

class Comboo {

    public static void combinationAssShit(String arr[], String data[], int start, int end, int index, int r){

    if (index == r)
     {
         for (int j=0; j<r; j++)
             System.out.print(data[j]+" ");

         System.out.println("");
         return;
     }

     for (int i=start; i<=end && end-i >= r-index; i++)
     {
         data[index] = arr[i];
         combinationAssShit(arr, data, i+1, end, index+1, r);
     }
 }

    public static void printCombination(String arr[], int n, int r)
    {
        String data[]=new String[r]; 
        combinationAssShit(arr, data, 0, n, 0, r);
    }

    public static String[] singleElem(String[] data) {
        List<String> single = new ArrayList<String>(); 

        for (String element: data) {
            for (int x = 0; x < element.length(); x++) {
                single.add(Character.toString(element.charAt(x)));
            }
        }

        Set<String> singleS = new LinkedHashSet<String>(single); 

        List<String> singleL = new ArrayList<String>(); 

        singleL.addAll(singleS); 

        String[] john = singleL.toArray(new String[singleL.size()]);
        return john;
    }

    public static void main (String[] args) {
        String arr[] = {"ABCD", "ACDEF", "ABDFG", "BDEF", "CGEGD"};
        int r = 3;

        String[] t = singleElem(arr);
        int n = t.length;
        printCombination(t, n, r);
    }
}

请注意。我知道有很多更正要做。我也是 Java 的新手。我习惯于 C++ 和 Python,在这个问题的情况下,通过从组合生成器产生结果来收集列表中的组合要容易得多。

【问题讨论】:

  • 没有 void 函数的结果。这就是空的定义。您需要返回一个实际值(例如一个字符串)才能在其他地方使用它。
  • 我明白了,这是这里的紧迫问题。有关于如何在递归循环中返回字符串的提示吗?
  • “我习惯于 C++ 和 Python,在这个问题的情况下,通过从组合生成器产生结果来收集列表中的组合要容易得多。”我很想知道你的意思。你应该能够在 Java 中做同样的事情。
  • for next in combinationAssShit(n, r-1) : yield combinationAssShit + next # args are diff
  • 哦,yield。是的,Java 肯定没有yield,我不确定return 是否可以替代您。也就是说,C++ 也没有yield,那么你将如何在 C++ 中实现呢?

标签: java list recursion void


【解决方案1】:

如果您想要返回最终结果(字符串),您可以将递归过程中的所有代码放入另一个辅助方法中,并让初始方法调用辅助方法并返回结果。 当然,您还需要使递归助手和您的方法都不是无效的,以便通过返回传递结果。

【讨论】:

    【解决方案2】:

    将方法的返回类型更改为List&lt;String&gt;,并将值添加到列表中:

    public static List<String> combinationAssShit(String arr[], String data[], int start, int end, int index, int r){
      List<String> result = new ArrayList<>();
      if (index == r) {
        StringBuilder sb = new StringBuilder();
        for (int j=0; j<r; j++) {
          sb.append(data[j]);
          sb.append(" ");
        }
        result.add(sb.toString());
      } else {
        for (int i=start; i<=end && end-i >= r-index; i++)
        {
          data[index] = arr[i];
          result.addAll(combinationAssShit(arr, data, i+1, end, index+1, r));
        }
      }
      return result;
    }
    

    或者,您可以将List&lt;String&gt; 作为参数添加到方法中,这样您就不必继续创建新实例:

    public static void combinationAssShit(
        String arr[], String data[], int start, int end, int index, int r,
        List<String> result){
    

    【讨论】:

    • "...您可以将 List 作为参数添加到方法中..." 我认为在递归编程中,这有时被称为“累加器”变量。
    猜你喜欢
    • 2016-04-22
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2020-11-17
    相关资源
    最近更新 更多