给出一个int数组,算出所有int数字排列组合

比如给出{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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值