A coding exercise
Richard Harter
g-rh at cca.CCA.COM
Sat Jul 9 14:20:26 AEST 1988
In article <12378 at mimsy.UUCP> chris at mimsy.UUCP (Chris Torek) writes:
>In article <30563 at cca.CCA.COM> g-rh at cca.CCA.COM (Richard Harter)
>transforms Kevin Kenny's `penultimate grdgen()' by the method I usually
>use (as opposed to essentially mechanical transforms): decide what it
>does, then decide how to do that.
Hey, I like this. I think of it as the "what's really going on
here?" approach. A simple example of this kind of thing is setting up a
loop. A loop usually looks something like this
initialize
loop
process case
determine next case
exit if no next case
end loop
Now the important thing about a loop is -- what is the thing that is to be
done in a single pass through the loop, i.e. what constitutes a case. Until
that has been clarified the issue of determining the next case is *obscure*.
In the present instance the 'case' may be
(a) an single distinct set of index values, or
(b) a primitive action, i.e. altering an index, a 'carry' operation, or
a action on the set of index values.
The first choice leads to one of the cited programs, the second to a state
machine implementation.
>Something that is important
>is that it *was* a series of mechanical transformations, and one that
>is suitable for embedding within a compiler. Given the level at which
>the problem was presented, reaching 7A from the original recursive
>version is rather a fair accomplishment.
Quite true. I was impressed.
Re the final goto using version, and the hand optimization used to get
to it, Chris remarks
>Actually, many optimising compilers do this internally, too.
This is an important point, which I didn't mention. If the compiler is
good, an 'optimized' version using goto's may actually compile into less
efficient code.
One final point is that there is a real optimization for this problem,
which is to use an analog of gray code. For those who aren't familiar
with it, gray code is a way of stepping through the binary integers such
that only one bit changes at each increment. Example:
000
001
011
010
110
111
101
100
(Gray code is quite often used in A/D converters.) When nlev>2 the numbers
in each column march up and then down with a modification direction rule.
Working this out is a fun problem which I won't spoil for anyone by posting
the code :-).
--
In the fields of Hell where the grass grows high
Are the graves of dreams allowed to die.
Richard Harter, SMDS Inc.
More information about the Comp.lang.c
mailing list