【问题标题】:Java - Returning from a recursive functionJava - 从递归函数返回
【发布时间】:2012-09-19 16:42:10
【问题描述】:

我正在尝试返回字符串数组中所有可能的值排列。我提出了以下代码,可以进行所有可能的排列;它工作正常。

private void combineArray(String sPrefix, String[] sInput, int iLength) {
    if (iLength == sPrefix.length()) {
        //This value should be returned and concatenated:
        System.out.println(sPrefix);
    } else {
        for (int i=0; i<sInput.length; i++) {
            combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength);
        }
    }
}

如果我输入 {x, y ,z} 它会打印到控制台:

xyz
xzy
yxz
yzx
zxy
zyx

我的问题是我找不到将这些值返回给原始调用函数的方法。所以我希望这个函数不返回“void”,而是一个包含 sPrefix 连接值的“String”。

我已经为此苦苦挣扎了一段时间,我似乎再也看不清楚了。 :) 任何帮助将不胜感激。

【问题讨论】:

  • 为什么不返回一个添加了所有字符串组合的列表?更好,不是吗?
  • 只是抛开一些想法,但是您能否在每次迭代期间更改外部数组,或者返回将通过每个递归级别返回的值数组?
  • 是的,只需从递归例程中返回数据。您可以返回常规的[] 数组或其中一个集合类,后者更好,因为您可以在从每个级别返回时添加到它。
  • 大声笑,你们都快得离谱。 :) 谢谢!我最初认为传入一个列表参数是行不通的,因为据我所知,Java 只通过值而不是通过引用传递......?另外,有没有优雅的方式使用 return 语句?
  • Java 通过引用传递所有对象。只有“缩放器”——整数、字符、浮点数等——按值传递。

标签: java arrays recursion permutation


【解决方案1】:

您可以拥有一个ArrayList&lt;String&gt; 并将所有字符串添加到其中.. 然后您可以返回这个 ArrayList..

List<String> listString = new ArrayList<>();
private void combineArray(String sPrefix, String[] sInput, int iLength) {
    if (iLength == sPrefix.length()) {
        listString.add(sPrefix);
        //This value should be returned and concatenated:
        System.out.println(sPrefix);
    } else {
        for (int i=0; i<sInput.length; i++) {
            combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength);
        }
    }
    return listString;
}

【讨论】:

    【解决方案2】:

    我认为将列表作为参数传递 in 并在方法中填充它可能会更好,而不是返回一个列表:

    private void combineArray(List<String> lOut, String sPrefix, String[] sInput, int iLength) {
        if (iLength == sPrefix.length()) {
            //This value should be returned and concatenated:
            System.out.println(sPrefix);
            lOut.add(sPrefix);
        } else {
            for (int i=0; i<sInput.length; i++) {
                combineArray(lOut, sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength);
            }
        }
    }
    

    然后你可以有一个包装方法来创建new ArrayList&lt;String&gt;,将它传递给上面的方法,然后返回它。

    【讨论】:

      【解决方案3】:

      继续追加到相同的输出。像这样:

      private String combineArray(String sPrefix, String[] sInput, int iLength, String output) {
          if (iLength == sPrefix.length()) {
              //This value should be returned and concatenated:
              System.out.println(sPrefix);
              output = output+"|+sPrefix;
              return output;
          } else {
              for (int i=0; i<sInput.length; i++) {
                  output = combineArray(sPrefix.concat(sInput[i]), ArrayUtils.removeElement(sInput, sInput[i]), iLength, output);
              }
          }
      }
      

      一旦基本概念有效,您也可以使用 ListArray 代替 String..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 2015-06-05
        • 1970-01-01
        • 2022-01-16
        相关资源
        最近更新 更多