比如给出{1,4,9}
下面是程序输出:
[[], [9], [4], [4, 9], [1], [1, 9], [1, 4], [1, 4, 9]]
下面是完整代码:
package java8.流.函数式编程;
import java.util.*;
/**
* @program: javaCodeThink
* @description: 对于{1,4,9} 我们可以分为包含1和不包含1的
* @author: fbl
* @create: 2020-11-09 09:16
**/
public class SubList {
public static void main(String[] args) {
ArrayList<Integer> ints = new ArrayList(Arrays.asList(new Integer[]{1, 4, 9}));
System.out.println(subsets(ints));
}
static List<List<Integer>> subsets(List<Integer> list){
if(list.isEmpty()){
ArrayList<List<Integer>> lists = new ArrayList<>();
lists.add(Collections.emptyList());
return lists;
}
Integer first = list.get(0);
List<Integer> rest = list.subList(1, list.size());
// 递归调用(有几次递归就要返回几次值)函数式编程进行了“尾调优化”:迭代调用发生在函数的最后
List<List<Integer>> subans = subsets(rest);
List<List<Integer>> subans2 = insertAll(first, subans);
return concat(subans, subans2);
}
static List<List<Integer>> insertAll(Integer first, List<List<Integer>> lists) {
// 函数式编程,引用透明化,不修改传递给他的参数
List<List<Integer>> result = new ArrayList<>();
for (List<Integer> list : lists) {
ArrayList<Integer> copyList = new ArrayList<>();
copyList.add(first);
copyList.addAll(list);
result.add(copyList);
}
return result;
}
static List<List<Integer>> concat(List<List<Integer>> a,List<List<Integer>> b){
// 函数式编程,引用透明化,不修改传递给他的参数
List<List<Integer>> result = new ArrayList<>(a);
result.addAll(b);
return result;
}
}