It took me a bit to convince myself that this is the correct formula. Denominator could just be `Math.min(listSize, items.size())`. In any case, we should cap `fn` so that `fn + tp <= listSize` (for positive `listSize`), as it is impossible for any fixed-length recommender to find all good items if # good is greater than its size.