【问题标题】:Creating a return type of a recursive method创建递归方法的返回类型
【发布时间】:2014-10-27 10:40:57
【问题描述】:

我有以下递归方法,可以为给定字符串生成排列。我正在尝试为 arraylist 中生成的字符串创建返回类型,更具体地说,我正在尝试将输出打印输出到 jsp 页面中。

 public static void permutation(String str) { 
      permutation("", str); 
 }

private static void permutation(String prefix, String str) {
     int n = str.length();
     if (n == 0) System.out.println(prefix);
     else {
          for (int i = 0; i < n; i++)
        permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+ n));
        }
}

【问题讨论】:

  • 我很难理解您所说的“创建返回类型”是什么意思。
  • @ChrisMartin 他的意思是他想从permutation返回一些东西,而不是仅仅返回void。但是,我仍然不确定应该是什么。
  • 你想有一个返回类型供稍后在 servlet 中使用,比如将这些结果字符串放在 object..ect 的数组列表中

标签: java jsp recursion arraylist


【解决方案1】:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Permute {

    public static void main(String[] args) {
        System.out.println(findAllPermutations("abc"));
    }

    public static List<String> findAllPermutations(String s) {
        if (s == null) {
            throw new NullPointerException();
        }
        if (s.length() <= 1) {
            return Arrays.asList(s);
        }

        List<String> permutations = new ArrayList<>();
        for (String permutation : findAllPermutations(s.substring(1))) {
            char ch = s.charAt(0);
            for (int i = 0; i <= permutation.length(); i++) {
                String prefix = permutation.substring(0, i);
                String suffix = permutation.substring(i);
                permutations.add(prefix + ch + suffix);
            }
        }
        return permutations;
    }
}

【讨论】:

    【解决方案2】:

    您可以使用静态列表来“收集”结果:

    static List<String> perms = new ArrayList<>();
    
    public static void main(String[] args) throws IOException {
        permutation("abc");
        System.out.println(Arrays.toString(perms.toArray())); // prints [abc, acb, bac, bca, cab, cba]
    }
    
    public static void permutation(String str) {
        permutation("", str);
    }
    
    private static void permutation(String prefix, String str) {
        int n = str.length();
        if (n == 0) {
            perms.add(prefix);
        }
        else {
            for (int i = 0; i < n; i++)
                permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1)); // you had a bug in the last index on this line
        }
    }
    

    或者,您可以创建列表并将其作为参数传递:

    public static void main(String[] args) throws IOException {
        List<String> perms = new ArrayList<>();
        permutation("abc", perms);
        System.out.println(Arrays.toString(perms.toArray())); // print [abc, acb, bac, bca, cab, cba]
    }
    
    public static void permutation(String str, List<String> perms) {
        permutation("", str, perms);
    }
    
    private static void permutation(String prefix, String str, List<String> perms) {
        int n = str.length();
        if (n == 0) {
            perms.add(prefix);
        }
        else {
            for (int i = 0; i < n; i++)
                permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1), perms);
        }
    }
    

    【讨论】:

    • -1。使用全局变量构造/存储方法的返回值是一个非常糟糕的主意。
    • @JimN 首先,我提供了第二种方法(不使用静态成员)。其次,我提供第一种方法的原因是用最少的代码更改(方法签名等)来解决问题。第三,如果在这个类中完成的所有工作都是在非线程程序的生命周期中创建一次排列,那么在这种情况下,使用静态字段就可以了。
    猜你喜欢
    • 2019-07-06
    • 1970-01-01
    • 2013-02-26
    • 2014-04-17
    • 2016-08-03
    • 2013-06-04
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多