"""
Functions to calculate nCr (ie how many ways to choose r items from n items)
"""
def combination(n, r):
    """This function calculates nCr."""
    if n == r or r == 0:
        return 1
    return combination(n-1, r-1) + combination(n-1, r)

def combination_memo(n, r):
    """This function calculates nCr using memoization method."""
    memo = {}
    def recur(n, r):
        if n == r or r == 0:
            return 1
        if (n, r) not in memo:
            memo[(n, r)] = recur(n - 1, r - 1) + recur(n - 1, r)
        return memo[(n, r)]
    return recur(n, r)