One of the most interesting mathematical stuff is Combination. A combination is a way of selecting members from a grouping, such that the order of selection does not matter (unlike permutation).

For example, assume that we have 6 balls (numbered from 1 to 6), and a person can select only 4 balls at a time.

Can you write a JavaScript function that can get all the possible 4 ball selections from the available 6 balls?

According to Combination, all the possible 4 ball selections from the 6 balls are (6 Choose 4) which equal to 15. The formula is very simple: n C r = n! / r! n-r! .

Now, let’s use recursion in order to get all the possible combinations.

var Util = function() { }; Util.getCombinations = function(array, size, start, initialStuff, output) { if (initialStuff.length >= size) { output.push(initialStuff); } else { var i; for (i = start; i < array.length; ++i) { Util.getCombinations(array, size, i + 1, initialStuff.concat(array[i]), output); } } } Util.getAllPossibleCombinations = function(array, size, output) { Util.getCombinations(array, size, 0, [], output); }

As shown in Util.getAllPossibleCombinations , it takes five parameters as follows:

1. array parameter represents the array of objects that we have.

2. size parameter represents the size of every selection from the array.

3. start parameter represents the current start index.

4. initialStuff parameter represents a temp array that holds every possible combination.

5. output parameter represents the array that holds all the possible arrays of combinations.

In order to know all the possible 4 balls selections from the available 6 balls, you can call the API simply as follows:

// Create an array that holds numbers from 1 ... 6. var array = []; for (var i = 1; i <= 6; ++i) { array[i - 1] = i; } var output = []; // Select only 4 balls out of the 6 balls at a time ... Util.getAllPossibleCombinations(array, 4, output); console.log(output);

In the console, you will find all the possible 15 combinations as follows:

[[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 3, 6], [1, 2, 4, 5], [1, 2, 4, 6], [1, 2, 5, 6], [1, 3, 4, 5], [1, 3, 4, 6], [1, 3, 5, 6], [1, 4, 5, 6], [2, 3, 4, 5], [2, 3, 4, 6], [2, 3, 5, 6], [2, 4, 5, 6], [3, 4, 5, 6]]