56 lines
1.6 KiB
JavaScript
56 lines
1.6 KiB
JavaScript
|
(function (exports) {
|
||
|
'use strict';
|
||
|
|
||
|
var variationsWithRepetion = (function () {
|
||
|
var res;
|
||
|
|
||
|
function variations(arr, k, index, current) {
|
||
|
if (k === index) {
|
||
|
return res.push(current.slice());
|
||
|
}
|
||
|
for (var i = 0; i < arr.length; i += 1) {
|
||
|
current[index] = arr[i];
|
||
|
variations(arr, k, index + 1, current);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Finds all the variations with repetition of given array.<br><br>
|
||
|
* Variations with repetition is the number of ways to sample k elements
|
||
|
* from a set of elements (which may be repeated).
|
||
|
*
|
||
|
* @example
|
||
|
* var variations = require('path-to-algorithms/src/combinatorics/' +
|
||
|
* 'variations-repetition').variationsWithRepetion;
|
||
|
* var result = variations(['apple', 'orange', 'pear'], 2);
|
||
|
*
|
||
|
* // [['apple', 'apple'],
|
||
|
* // ['apple', 'orange'],
|
||
|
* // ['apple', 'pear'],
|
||
|
* // ['orange', 'apple'],
|
||
|
* // ['orange', 'orange'],
|
||
|
* // ['orange', 'pear'],
|
||
|
* // ['pear', 'apple'],
|
||
|
* // ['pear', 'orange'],
|
||
|
* // ['pear', 'pear']]
|
||
|
* console.log(result);
|
||
|
*
|
||
|
* @module combinatorics/variations-repetition
|
||
|
* @public
|
||
|
* @param arr {Array} Set of items.
|
||
|
* @param k {Number} Size of each combination.
|
||
|
* @return {Array} Returns all combinations.
|
||
|
*/
|
||
|
return function (arr, k) {
|
||
|
res = [];
|
||
|
variations(arr, k, 0, []);
|
||
|
var temp = res;
|
||
|
res = undefined;
|
||
|
return temp;
|
||
|
};
|
||
|
}());
|
||
|
|
||
|
exports.variationsWithRepetion = variationsWithRepetion;
|
||
|
|
||
|
}((typeof window === 'undefined') ? module.exports : window));
|