Description:

In this code example, we give two functions that calculate combinations. The first function is recursive and calculates combinations by using the well-known formula c(N, R) = c(N - 1, R) + C(N - 1, R - 1). The second function performs an iterative calculation using the formula C(N, R) = C(N, R - 1)*((N-R+1)/R). In either case, we have C(N, N) = C(N, 0) = 1 and C(N, R) = 0, if R < 0 or R > N. The explicit formula for Combinations is C(N, R) = N!/((N-R)!R!) but is highly susceptible to overflow or rounding errors if used directly.

Combinations tell us the number ways that we can choose R items from N distinct ones. For example, if we have four people. Then there are C(4,2) = 4!/(2!2!) = 6 ways to pick two of the people to work on a project.

Example

#include <iostream>

int CombinationsRecur(int iN, int iR) {
    if (iR < 0 || iR > iN) {
        return 0;
    }
    if (iR < 1) {
        return 1;
    }
    if (iN == iR) {
        return 1;
    }
    return CombinationsRecur(iN - 1, iR) + CombinationsRecur(iN - 1, iR - 1);
}

int CombinationsIter(int iN, int iR) {
    if (iR < 0 || iR > iN) {
        return 0;
    }
    int iComb = 1;
    int i = 0;
    while (i < iR) {
        ++i;
        iComb *= iN - i + 1;
        iComb /= i;
    }
    return iComb;
}

int main()
{
    for (int i = 0; i < 12; ++i) {
        for (int j = 0; j <= i; ++j) {
            std::cout << CombinationsRecur(i, j) << "  ";
        }
        std::cout << std::endl;
    }

    for (int i = 0; i < 12; ++i) {
        for (int j = 0; j <= i; ++j) {
            std::cout << CombinationsIter(i, j) << "  ";
        }
        std::cout << std::endl;
    }

    return 0;
}

Output:

Combinations Output Output