50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
|
(function (exports) {
|
||
|
'use strict';
|
||
|
|
||
|
var cartesianProduct = (function () {
|
||
|
var result;
|
||
|
|
||
|
function cartesianProduct(sets, index, current) {
|
||
|
if (index === sets.length) {
|
||
|
return result.push(current.slice());
|
||
|
}
|
||
|
for (var i = 0; i < sets[index].length; i += 1) {
|
||
|
current[index] = sets[index][i];
|
||
|
cartesianProduct(sets, index + 1, current);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Calculates Cartesian product of provided sets.
|
||
|
*
|
||
|
* @module combinatorics/cartesianproduct
|
||
|
* @public
|
||
|
* @param {Array} sets Array of sets.
|
||
|
* @return {Array} Cartesian product of provided sets.
|
||
|
*
|
||
|
* @example
|
||
|
* var product = require('path-to-algorithms/src/combinatorics/' +
|
||
|
* 'cartesianproduct').cartesianProduct;
|
||
|
* var result = product([[1, 2, 3], [3, 2, 1]]);
|
||
|
* // [ [ 1, 3 ],
|
||
|
* // [ 1, 2 ],
|
||
|
* // [ 1, 1 ],
|
||
|
* // [ 2, 3 ],
|
||
|
* // [ 2, 2 ],
|
||
|
* // [ 2, 1 ],
|
||
|
* // [ 3, 3 ],
|
||
|
* // [ 3, 2 ],
|
||
|
* // [ 3, 1 ] ]
|
||
|
* console.log(result);
|
||
|
*/
|
||
|
return function (sets) {
|
||
|
result = [];
|
||
|
cartesianProduct(sets, 0, []);
|
||
|
return result;
|
||
|
};
|
||
|
}());
|
||
|
|
||
|
exports.cartesianProduct = cartesianProduct;
|
||
|
|
||
|
}((typeof window === 'undefined') ? module.exports : window));
|