technique where the results of computations are stored and reused when the same inputs occur again thus avoiding the need to recompute the same results