Memoization is a technique to optimize recursion by saving results of function calls. When the function is called with a value, it first checks if the answer is already saved in a dictionary called memo. If yes, it returns that saved answer immediately. If not, it computes the answer recursively, saves it in memo, and then returns it. This way, repeated calculations are avoided, making the recursion much faster. For example, in Fibonacci calculation, fib(2) is computed once and stored. Later calls reuse this stored value instead of recalculating fib(2) again. This reduces the total number of recursive calls and speeds up the program.