排列组合的定义
排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。
排列组合为高中数学知识,主要用于求概率的问题。
排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个不同的元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 或表示。
组合的定义:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。
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));
正好,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));
正好,C(5,3) = A(5,3) / A(3,3) = 10
测试通过
代码灵感来源于www.cnblogs.com/kaiye/p/360…