【发布时间】: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