Here's an example I've written to demonstrate. The spreadsheet is here. It has three columns. The first two, headed

**input**and

**output**, are one row each. Type a number into

**input**, and its factorial will appear in

**output**.

And here is the Excelsior program I generated this spreadsheet from:

table input : -> general. table output : -> general. output[ ] = fac[ input[] ]. type fac_range = 0:100. table fac : fac_range -> general. fac[ 0 ] = 1. fac[ n>0 ] = n * fac[ n-1 ]. layout( 'Sheet 1' , rows( heading , row( input as null , output as null , fac as y ) ) ).

The key to understanding this is that Excelsior thinks of a spreadsheet as a collection of tables. The Excelsior keyword for these is

`table`

. When Excelsior generates a spreadsheet, it maps each table onto one or more cells, as dictated by the `layout`

statement. In this program, that statement puts `fac`

to the right of `output`

to the right of `input`

, and runs `fac`

down the sheet. Since `fac`

has one dimension — as indicated by the `type`

statement for `fac_range`

, and by the `table`

declaration for `fac`

— that makes it occupy a single column.The key to understanding the recursion is to think of tables as functions. Indeed, my syntax for table declarations imitates the notation used by mathematicians to specify a function's argument and result types. The two equations for

`fac`

then become analogous to the usual recursive definition of factorial.This, clearly, is recursion. But it's laid out — spread out, you might say — in space rather than in time.

So that generates the factorials. The remaining part of the program is that which gets the right factorial from the table and puts it into the output cell. Namely, the first three statements. The first two declare the input and output cells as tables that have no subscripts, and are therefore one cell each. The third statement uses the input as a subscript to

`fac`

, and puts the result into the output.And that's how to program recursion in Excel.

## No comments:

## Post a comment