# Essays/Memo

A demonstration of the efficacy of memoization.

comb0 is the classical doubly recursion definition found in Gilman and Rose; combm is the same thing with M. applied; comb is from the for. page of the dictionary and has been worked on for more than 30 years by myself and others.

```comb0=: 4 : 0   NB. All size x combinations of i.y
if. (x>:y)+.0=x do. i.(x<:y),x else. (0,.x comb0&.<: y),1+x comb0 y-1 end.
)

combm=: 4 : 0 M.
if. (x>:y)+.0=x do. i.(x<:y),x else. (0,.x combm&.<: y),1+x combm y-1 end.
)

comb=: 4 : 0
k=. i.>:d=.y-x
z=. (d\$<i.0 0),<i.1 0
for. i.x do. z=. k ,.&.> ,&.>/\. >:&.> z end.
; z
)
```

The benchmark is 10 comb 20 .

 time space comb0 4.04831 25169088 combm 0.16492 44554944 comb 0.159853 24965312

Thus, combm is a straightforward definition which is competitive in time and space with the highly polished comb .

combm1 is like combm but captures the arguments in cases where the body of the verb is evaluated with arguments.  combm1 can be called multiple times with some of these arguments, but all but the first call is intercepted by the M. mechanism and the result computed by table look-up.

```foo=: 0 2\$0

combm1=: 4 : 0 M.
foo=: foo,x,y
if. (x>:y)+.0=x do. i.(x<:y),x else. (0,.x combm1&.<: y),1+x combm1 y-1 end.
)

\$ 10 combm1 20
184756 10

\$ foo
123 2

_20 <\ ": foo
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│10 20│ 5  5│ 9 12│ 9 14│ 1  6│ 2 10│ 2 12│
│10 19│ 4  5│ 8 11│ 8 13│ 1  7│ 1  9│ 1 11│
│10 18│ 4  4│ 7 10│ 7 12│ 0  6│ 0  8│ 0 10│
│10 17│ 3  4│ 6  9│ 6 11│ 9 16│ 9 18│     │
│10 16│ 3  3│ 5  8│ 5 10│ 8 15│ 8 17│     │
│10 15│ 2  3│ 4  7│ 4  9│ 7 14│ 7 16│     │
│10 14│ 2  2│ 3  6│ 3  8│ 6 13│ 6 15│     │
│10 13│ 1  2│ 2  5│ 2  7│ 5 12│ 5 14│     │
│10 12│ 1  1│ 1  4│ 1  6│ 4 11│ 4 13│     │
│10 11│ 0  1│ 0  3│ 0  5│ 3 10│ 3 12│     │
│10 10│ 9 11│ 9 13│ 9 15│ 2  9│ 2 11│     │
│ 9 10│ 8 10│ 8 12│ 8 14│ 1  8│ 1 10│     │
│ 9  9│ 7  9│ 7 11│ 7 13│ 0  7│ 0  9│     │
│ 8  9│ 6  8│ 6 10│ 6 12│ 9 17│ 9 19│     │
│ 8  8│ 5  7│ 5  9│ 5 11│ 8 16│ 8 18│     │
│ 7  8│ 4  6│ 4  8│ 4 10│ 7 15│ 7 17│     │
│ 7  7│ 3  5│ 3  7│ 3  9│ 6 14│ 6 16│     │
│ 6  7│ 2  4│ 2  6│ 2  8│ 5 13│ 5 15│     │
│ 6  6│ 1  3│ 1  5│ 2  7│ 4 12│ 4 14│     │
│ 5  6│ 0  2│ 0  4│ 2  6│ 3 11│ 3 13│     │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┘
```

Contributed by Roger Hui.