Homework Assignment 4.
CS 316, Spring 2003.

Due on Thursday, February 20, 2003.


1.) Write a tail recursive version of the procedure make-list
from Assignment 1 (i.e., Exercise 2.8.3).


2.) Here is a recursive procedure which computes x raised to the
power y, where x can be any number and y is a positive integer.

(define pow
  (lambda (x y)
     (if (= y 0) 1 (* x (pow x (- y 1))))))

Write a tail recursive version of this procedure.


3.) Write a tail recursive version of a procedure reverse that
takes a single parameter that is a list and returns a list with
the items in the reverse order. So

(reverse '(1 2 3))  ==> (3 2 1)
(reverse '( a (b c) d e))  ==> (e d (b c) a)


4.) Use reverse from the previous problem to help write a tail
recursive version of a procedure append which takes two arguments,
a list and an item, and returns a list with the item appended to
the end of the list.

(append '(a b c) 3))  ==> (a b c 3)
(append '(a b c) '(d e))  ==> (a b c (d e))


5.) Write a procedure called print-frame that takes two parameters,
both of them even integers. This procedure should use Scheme's display
procedure to write an "ascii-art frame" in the interactions window
consisting of two squares, one inside of the other, with the corners
of the two squares connected with diagonal lines. The dimensions of
the two squares are given by the two integer parameters. Here are a
couple of examples. The procedure call

(print-frame 20 12)

should produce the following output in the interactions window.
(Notice that these really are "squares" in that they have the same
number of characters in their horizontal and vertical sides.)

********************
**                 *
* *              * *
*  *            *  *
*   ************   *
*   *          *   *
*   *          *   *
*   *          *   *
*   *          *   *
*   *          *   *
*   *          *   *
*   *          *   *
*   *          *   *
*   *          *   *
*   *          *   *
*   ************   *
*  *            *  *
* *              * *
**                **
********************

The procedure call

(print-frame 6 24)

should produce the following output. Notice that the larger of the
two input integers should be the dimension of the outer "square".

************************
**                    **
* *                  * *
*  *                *  *
*   *              *   *
*    *            *    *
*     *          *     *
*      *        *      *
*       *      *       *
*        ******        *
*        *    *        *
*        *    *        *
*        *    *        *
*        *    *        *
*        ******        *
*       *      *       *
*      *        *      *
*     *          *     *
*    *            *    *
*   *              *   *
*  *                *  *
* *                  * *
**                    **
************************

The return value of the procedure print-frame is undefined. Implement
print-frame using tail recursive helper procedures to do all of the
looping.