We appreciate the virtues of caching, but we do this to look at referential transparency, a cornerstone of functional programming.
In the preceding example, note that we are able to cache the results, as the results of the computation are not going to change for the same input. We need not repeat the computations; instead, we could compute the answer once and save and substitute it.
In the FP world, where we can substitute a function by its value, the function is called referentially transparent. Just like we avoid repeated calls in the previous algorithm, repeated calls to such functions could be avoided by caching the result.
Mathematical functions are referentially transparent. For example, the following Clojure functions ...