【问题标题】:Permutation of an ArrayList of numbers using recursion使用递归排列数字的 ArrayList
【发布时间】:2014-08-19 01:47:36
【问题描述】:

我正在尝试通过创建 ArrayList 的排列来学习递归:

 {1,2,3}

但递归调用的概念一直在我脑海中浮现。我知道如何做一个迭代解决方案。但是有没有一种系统的方法可以将我的迭代解决方案转换为递归解决方案?

private static ArrayList<ArrayList<Integer>> permutate(ArrayList<Integer> list) {
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();

    result.add(new ArrayList<Integer>());

    for (int i = 0; i < list.size(); i++) {
        ArrayList<ArrayList<Integer>> current = new ArrayList<ArrayList<Integer>>();

        for (ArrayList<Integer> l : result) {
            for (int j = 0; j < l.size()+1; j++) {
                l.add(j, list.get(i));

                ArrayList<Integer> temp = new ArrayList<Integer>(l);
                current.add(temp);

                l.remove(j);
            }
        }

        result = new ArrayList<ArrayList<Integer>>(current);
    }

    return result;

}

【问题讨论】:

  • 你为什么要把一个arraylist包装在另一个......?在任何情况下,这样想,排列一个列表 {a, b, c, d,..} 可以通过选择一个随机元素来完成,比如 b,删除它,然后排列列表的其余部分。所以结果 = {b} union {permutation of rest of list}。这就是你的递归
  • 我正在返回一个排列的 ArrayLists 的 ArrayList。
  • 有一种设计递归方法的系统方法。首先,您想象某处已经存在该方法的工作版本。然后你问自己,你怎么能通过使用另一个预先存在的方法来编写你的方法,但条件是在你进行递归调用之前你必须将问题减少到一个(稍微)更小的问题。一旦你写了你添加一个停止条件并再次检查生成的方法,看看是否需要任何额外的调整。
  • 这就是答案,不要做已经存在的事情。 stackoverflow.com/a/25704984/5218261

标签: java recursion arraylist


【解决方案1】:

你来了,伙计:

main:
ArrayList<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    ArrayList<ArrayList<Integer>> ans = permutate(list, null, 0);


private static ArrayList<ArrayList<Integer>> permutate(
        ArrayList<Integer> list, ArrayList<Integer> curlist, int cur) {
    if (cur == 0) {
        ArrayList<ArrayList<Integer>> totalAns = new ArrayList<ArrayList<Integer>>();
        for (Iterator<Integer> iterator = list.iterator(); iterator
                .hasNext();) {
            Integer integer = (Integer) iterator.next();
            ArrayList<Integer> tmp3 = new ArrayList<Integer>();
            tmp3.add(integer);
            ArrayList<ArrayList<Integer>> firstAns = permutate(list, tmp3,
                    cur + 1);
            for (Iterator<ArrayList<Integer>> iterator2 = firstAns
                    .iterator(); iterator2.hasNext();) {
                ArrayList<Integer> arrayList = (ArrayList<Integer>) iterator2
                        .next();
                totalAns.add(arrayList);

            }
        }
        return totalAns;
    }
    if (cur == list.size()) {
        ArrayList<ArrayList<Integer>> tmp2 = new ArrayList<ArrayList<Integer>>();
        tmp2.add(curlist);
        return tmp2;
    }

    ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>();
    for (int i = 0; i < list.size(); i++) {
        if (!curlist.contains(list.get(i))) {
            @SuppressWarnings("unchecked")
            ArrayList<Integer> tmp = (ArrayList<Integer>) curlist.clone();
            tmp.add(list.get(i));
            ArrayList<ArrayList<Integer>> recAns = permutate(list, tmp,
                    cur + 1);
            for (int k = 0; k < recAns.size(); k++) {
                ans.add(recAns.get(k));
            }
        }

    }
    return ans;
}

【讨论】:

  • 正如我在上面对 Mike 的回答所评论的那样,您在技术上没有回答“是否有系统的方法可以将我的迭代解决方案转换为递归解决方案?”说“这是一个递归解决方案”并不能严格回答这个问题。此外,解释代码(以及您的思考过程)将使这更有可能成为真正的答案。
【解决方案2】:
public static List<List<Integer>> listPermutations(List<Integer> list) {

    if (list.size() == 0) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        result.add(new ArrayList<Integer>());
        return result;
    }

    List<List<Integer>> returnMe = new ArrayList<List<Integer>>();

    Integer firstElement = list.remove(0);

    List<List<Integer>> recursiveReturn = listPermutations(list);
    for (List<Integer> li : recursiveReturn) {

        for (int index = 0; index <= li.size(); index++) {
            List<Integer> temp = new ArrayList<Integer>(li);
            temp.add(index, firstElement);
            returnMe.add(temp);
        }

    }
    return returnMe;
}

为了测试我使用了:

public static void main(String[] args) throws Exception {

    List<Integer> intList = new ArrayList<Integer>();
    intList.add(1);
    intList.add(2);
    intList.add(3);
    List<List<Integer>> myLists = listPermutations(intList);

    for (List<Integer> al : myLists) {
        String appender = "";
        for (Integer i : al) {
            System.out.print(appender + i);
            appender = " ";
        }
        System.out.println();
    }

}

这给了我输出:

1 2 3
2 1 3
2 3 1
1 3 2
3 1 2
3 2 1

【讨论】:

  • 您知道,尽管您回答问题很好,但我认为至少解释您在做什么会很好。你在没有任何解释的情况下为他/她编写代码对 OP 没有任何帮助。
  • 此外,您并没有从技术上回答以下问题:“是否有系统的方法可以将我的迭代解决方案转换为递归解决方案?”说“这是一个递归解决方案”并不能严格回答这个问题。
猜你喜欢
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
相关资源
最近更新 更多