Next: Programming Answer 12, Previous: Programming Answer 10, Up: Answers to Exercises [Contents][Index]

#### 2.7.68 Programming Tutorial Exercise 11

First we define a dummy program to go on the `z s` key. The true `z s` key is supposed to take two numbers from the stack and return one number, so `DEL` as a dummy definition will make sure the stack comes out right.

    2:  4          1:  4                         2:  4
    1:  2              .                         1:  2
        .                                            .

      4 RET 2       C-x ( DEL C-x )  Z K s RET       2

The last step replaces the 2 that was eaten during the creation of the dummy `z s` command. Now we move on to the real definition. The recurrence needs to be rewritten slightly, to the form ‘`s(n,m) = s(n-1,m-1) - (n-1) s(n-1,m)`’.

(Because this definition is long, it will be repeated in concise form below. You can use `C-x * m` to load it from there.)

    2:  4        4:  4       3:  4       2:  4
    1:  2        3:  2       2:  2       1:  2
        .        2:  4       1:  0           .
                 1:  2           .
                     .

      C-x (       M-2 RET        a =         Z [  DEL DEL 1  Z :

    4:  4       2:  4                     2:  3      4:  3    4:  3    3:  3
    3:  2       1:  2                     1:  2      3:  2    3:  2    2:  2
    2:  2           .                         .      2:  3    2:  3    1:  3
    1:  0                                            1:  2    1:  1        .
        .                                                .        .

      RET 0   a = Z [  DEL DEL 0  Z :  TAB 1 - TAB   M-2 RET     1 -      z s

(Note that the value 3 that our dummy `z s` produces is not correct; it is merely a placeholder that will do just as well for now.)

    3:  3               4:  3           3:  3       2:  3      1:  -6
    2:  3               3:  3           2:  3       1:  9          .
    1:  2               2:  3           1:  3           .
        .               1:  2               .
                            .

     M-TAB M-TAB     TAB RET M-TAB         z s          *          -

    1:  -6                          2:  4          1:  11      2:  11
        .                           1:  2              .       1:  11
                                        .                          .

      Z ] Z ] C-x )   Z K s RET      DEL 4 RET 2       z s      M-RET k s

Even though the result that we got during the definition was highly bogus, once the definition is complete the `z s` command gets the right answers.

Here’s the full program once again:

    C-x (  M-2 RET a =
           Z [  DEL DEL 1
           Z :  RET 0 a =
                Z [  DEL DEL 0
                Z :  TAB 1 - TAB M-2 RET 1 - z s
                     M-TAB M-TAB TAB RET M-TAB z s * -
                Z ]
           Z ]
    C-x )

You can read this definition using `C-x * m` (`read-kbd-macro`) followed by `Z K s`, without having to make a dummy definition first, because `read-kbd-macro` doesn’t need to execute the definition as it reads it in. For this reason, `C-x * m` is often the easiest way to create recursive programs in Calc.

Next: Programming Answer 12, Previous: Programming Answer 10, Up: Answers to Exercises [Contents][Index]