Fibonacci numbers: memoization using the state monad #
The naive way of computing Fibonacci numbers is very inefficient because it recomputes the same values many times. We can use the state monad to store the values of the Fibonacci numbers we have already computed. This is a simple example of memoization.
We will also take a more complicated example: Catalan numbers. The Catalan numbers are a sequence of natural numbers that occur in various counting problems, often involving recursively defined objects. They satisfy the recurrence relation:
- $C_0 = 1`,
- $C_n = \sum_{i=1}^n C_{i-1} C_{n-i}$, for $n \geq 0.$
Catalan numbers #
@[reducible, inline]
Equations
Instances For
@[reducible, inline]
Equations
Instances For
@[irreducible]
Equations
- One or more equations did not get rendered due to their size.
- Catalan.cat 0 = pure 1
Instances For
@[reducible, inline]
Equations
Instances For
@[reducible, inline]
Equations
Instances For
@[irreducible]
Equations
- One or more equations did not get rendered due to their size.
- CatalanSimple.cat 0 = pure 1
Instances For
- memo : Std.HashMap Nat Nat
- natOps : Nat
- count : Nat
Instances For
Equations
- CatalanOps.instInhabitedCatState = { default := { memo := default, natOps := default, count := default } }
Equations
- One or more equations did not get rendered due to their size.
@[reducible, inline]
Equations
Instances For
Equations
- CatalanOps.addOps n = modify fun (s : CatalanOps.CatState) => { memo := s.memo, natOps := s.natOps + n, count := s.count }
Instances For
Equations
- CatalanOps.withCount x = do modify fun (s : CatalanOps.CatState) => { memo := s.memo, natOps := s.natOps, count := s.count + 1 } x
Instances For
@[irreducible]
Equations
- One or more equations did not get rendered due to their size.
- CatalanOps.cat 0 = pure 1
Instances For
Equations
- MyStateM.pure a = { run := fun (s : σ) => (a, s) }
Instances For
Equations
- MyStateM.get = { run := fun (s : σ) => (s, s) }
Instances For
Equations
- MyStateM.set s = { run := fun (x : σ) => ((), s) }
Instances For
Equations
- MyStateM.modify f = { run := fun (s : σ) => ((), f s) }
Instances For
Equations
- x.run' s = match x.run s with | (a, snd) => a