排列组合算法实现--基于JS

公司要做了个彩票的预测奖金业务,居然要用到高中的排列组合,好吧,这个时候不得不承认,高中没有白上啊.....

排列组合的思想大家都清楚(不清楚的请回高中自行面壁。)   C n n一下子理不清,于是我从最简单的C n  2开始

C n 2代码:

/**
 * 排列组合(C n 2)     n个数中选出2个数的所有情况。
 * @param self  第一位(两位数的第一位)
 * @param arr   C n 2)中的n。属于排列组合的基值。
 * @param index  开始的位置
 * @param total  所有的排列情况。数组
 */
var plzh = function plsz(self, arr, index, total) {
    if (self == "") {
        self = arr[index++];
        plzh(self, arr, index, total);
    } else if (index == arr.length) {
        index = $.inArray(self, arr);
        if (index == arr.length - 1) {
            return;
        } else {
            plzh("", arr, ++index, total);
        }
    } else {
        other = arr[index++];
        total.push(self + other);
        plzh(self, arr, index, total);
    }
}
var total = [];
plzh("", ['', '', '', ''], 0, total);
console.log(total);
由此推论出C n n代码:
/**
 *C n n
 * @param _selfs    当前的组合[]
 * @param _arr      所有组合的基值[]
 * @param _indexs   当前的组合对应的基值的索引[]
 * @param _total    排列组合结果
 * @param _where    当前排列组合循环的位置
 */
function plzh(_selfs, _arr, _indexs, _total, _where) {
    if (_selfs != null && tools.isNotNull(_arr) && _arr.length >= _selfs.length) {
        if (_where < _selfs.length - 1) { //非末位
            var index = _indexs[_where];
            if (index == _arr.length) { //非末位末尾
                --_where;
                if (_where == -1) { //首位超出
                    return;
                } else {
                    _indexs[_where] = _indexs[_where] + 1;
                    for (var i = _where + 1; i < _selfs.length; i++) {
                        _indexs[i] = _indexs[i - 1] + 1;
                    }
                    plzh(_selfs, _arr, _indexs, _total, _where);
                }
            } else {
                _selfs[_where] = _arr[index];
                plzh(_selfs, _arr, _indexs, _total, ++_where);
            }
        } else { //末位
            var index = _indexs[_where];
            if (index == _arr.length) {  //直接末位末尾
                --_where;
                if (_where == -1) { //末位超出即 单关
                    return;
                }
                _indexs[_where] = _indexs[_where] + 1;
                for (var i = _where + 1; i < _selfs.length; i++) {
                    _indexs[i] = _indexs[i - 1] + 1;
                }
                plzh(_selfs, _arr, _indexs, _total, _where);
            } else {
                _selfs[_where] = _arr[index];
                _total.push(copy.deepCoby(_selfs));
                var _nextIndex = _indexs[_where] + 1;
                if (_nextIndex < _arr.length) {
                    _indexs[_where] = _nextIndex;
                    plzh(_selfs, _arr, _indexs, _total, _where);
                } else { //下一个末位末尾
                    --_where;
                    if (_where == -1) {
                        return;
                    }
                    _indexs[_where] = _indexs[_where] + 1;
                    for (var i = _where + 1; i < _selfs.length; i++) {
                        _indexs[i] = _indexs[i - 1] + 1;
                    }
                    plzh(_selfs, _arr, _indexs, _total, _where);
                }
            }
        }
    }
}


var _selfs = new Array(3);
var _arr = ['','','','','','','绿',''];
var _indexs = [0,1,2]; //初始排列组合为 黑白黄,即对应的_arr的索引下标为0,1,2
var _where = 0;
var _total = [];
plzh(_selfs, _arr, _indexs, _total, _where);
console.log(JSON.stringify(_total));


附:deepCopy 是我的一个深度克隆复制的方法

/**
 * @param obj   clone的对象
 * @return      clone对象
 */
deepCoby: function (obj) {
    // Handle the 3 simple types, and null or undefined
    if (null == obj || "object" != typeof obj)
        return obj;
    // Handle Date
    if (obj instanceof Date) {
        var copy = new Date();
        copy.setTime(obj.getTime());
        return copy;
    }

    // Handle Array
    if (obj instanceof Array) {
        var copy = [];
        for (var i = 0, len = obj.length; i < len; ++i) {
            copy[i] = this.deepCoby(obj[i]);
        }
        return copy;
    }
    // Handle Object
    if (obj instanceof Object) {
        var copy = {};
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr)) copy[attr] = this.deepCoby(obj[attr]);
        }
        return copy;
    }
    throw new Error("Unable to copy obj! Its type isn't supported.");
}


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值