The procedure
square-list takes a list of numbers as argument and returns a list of the squares of those numbers.> (square-list (list 1 2 3 4)) (1 4 9 16)
Here are two different definitions of
square-list. Complete both of them by filling in the missing expressions:
(define (square-list items)
(if (null? items)
nil
(cons <??> <??>)))
(define (square-list items)
(map <??> <??>))
We're given two skeleton procedures here. The first procedure is similar to the recursive definition of
scale-list in the Mapping over lists section of the book and is obviously the basis for a recursive procedure, while the second is analogous to the map-based definition of scale-list. The difference between scale-list and square-list is simply that the former scales each element of the list by some factor while the latter squares each element of the list. So our square-list implementations will bear an uncanny resemblance to scale-list, with just the scaling replaced with squaring.Assuming we've got
square defined as before:
(define (square x) (* x x))...then we can produce the recursive implementation as follows:
(define (square-list items)
(if (null? items)
nil
(cons (square (car items)) (square-list (cdr items)))))
...which produces the results:
> (square-list (list 1 2 3 4 5 6 7 8 9 10)) (1 4 9 16 25 36 49 64 81 100)When it comes to the
map-based version, we don't need to define a lambda-procedure as was necessary for scale-list, as we already have a procedure defined that provides the functionality we require: square. So we can define the map-based version as follows:
(define (square-list items) (map square items))Of course this gives exactly the same results:
> (square-list (list 1 2 3 4 5 6 7 8 9 10)) (1 4 9 16 25 36 49 64 81 100)
No comments:
Post a Comment