"Overlapping" sub-problems means that the space of sub-problems must be small, that is, any recursive algorithm solving the problem should solve the same sub-problems over and over, rather than generating new sub-problems. For example, consider the recursive formulation for generating the Fibonacci series: "F""i" = "F""i"−1 + "F""i"−2, with base case "F"1 = "F"2 = 1. Then "F"43 = "F"42 + "F"41, and "F"42 = "F"41 + "F"40. Now "F"41 is being solved in the recursive sub-trees of both "F"43 as well as "F"42. Even though the total number of sub-problems is actually small (only 43 of them), we end up solving the same problems over and over if we adopt a naive recursive solution such as this. Dynamic programming takes account of this fact and solves each sub-problem only once.