JavaScript中递归实现排列组合问题

题目:
var list = [“a”,“b”]; 得到:[“ab”,“ba”];
var list = [“a”,“b”,“c”]; 得到: a [“b”,“c”] [“bc”,“cb”] [“abc”,“acb”]
b [“a”,“c”] [“ac”,“ca”] [“bac”,“bca”]
c [“a”,“b”] [“ab”,“ba”] [“cab”,“cba”]

代码:

function fn(list){
        if(list.length==2){	 //递归的出口,最终剩下两个元素时将它们交换顺序
            return [list[0]+list[1],list[1]+list[0]];
        }
        var result=[];             //声明一个数组,存储最终的结果
        for(var i=0;i<list.length;i++){
            var first=list.splice(i,1);        //达到依次挑出a,b,c,d...使其依次排到最前面,使组合达到有序的目的
            var before=fn(list);      //剩下的数组中的数继续调用函数,使其最终达到数组里只剩下两个元素,然后元素互换位置,最终再倒推回来
            for(var j=0;j<before.length;j++){
                result.push(first+before[j]);      //把刚开始挑出的元素与已排列好的元素进行拼接
            }
            list.splice(i,0,first);    //因为为了在before中实现剩余元素的组合,将list[i]给去掉了,所以需要添加回来,以保证下次依次挑选元素时位置正确,且排列时不会缺少元素
        }
        return result;
    }
    var list=['a','b','c','d'];
    document.write(fn(list));

粗略讲解:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值