js 实现排列组合

4,975 阅读1分钟

排列组合的定义

排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。

排列组合为高中数学知识,主要用于求概率的问题。

排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个不同的元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 或表示。

image.png

组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。

image.png

js实现

排列

function queue(arr, size) {
    if (size > arr.length) { return; }
    var allResult = [];

    (function (arr, size, result) {
        if (result.length == size) {
            allResult.push(result);
        } else {
            for (var i = 0, len = arr.length; i < len; i++) {
                var newArr = [].concat(arr),
                    curItem = newArr.splice(i, 1);
                arguments.callee(newArr, size, [].concat(result, curItem));
            }
        }
    })(arr, size, []);

    return allResult;
}

测试一下

function showResult(result) {
    console.log('The number of result sets: ' + result.length);
    for (var i = 0, len = result.length; i < len; i++) {
        console.log(result[i]);
    }
}
var arr = ['1', '2', '3'];
showResult(queue(arr, 3));

image.png

正好,A(3,3) = 3! = 6

组合

function choose(arr, size) {
    var allResult = [];

    (function (arr, size, result) {
        var arrLen = arr.length;
        if (size > arrLen) {
            return;
        }
        if (size == arrLen) {
            allResult.push([].concat(result, arr))
        } else {
            for (var i = 0; i < arrLen; i++) {
                var newResult = [].concat(result);
                newResult.push(arr[i]);

                if (size == 1) {
                    allResult.push(newResult);
                } else {
                    var newArr = [].concat(arr);
                    newArr.splice(0, i + 1);
                    arguments.callee(newArr, size - 1, newResult);
                }
            }
        }
    })(arr, size, []);

    return allResult;
}

测试一下

function showResult(result) {
    console.log('The number of result sets: ' + result.length);
    for (var i = 0, len = result.length; i < len; i++) {
        console.log(result[i]);
    }
}
var arr = ['1', '2', '3', '4', '5'];
showResult(choose(arr, 3));

image.png

正好,C(5,3) = A(5,3) / A(3,3) = 10

测试通过

代码灵感来源于www.cnblogs.com/kaiye/p/360…