Define a procedure
last-pair
that returns the list that contains only the last element of a given (nonempty) list:> (last-pair (list 23 72 149 34)) (34)We know that we can identify the last pair in a list by the
cdr
of the pair being nil
, and returning this pair will give us the result we need. All we need to do is to walk through the list recursively, in a similar manner to the list operations defined in the book, and stop when we reach such a pair.Here's my implementation:
(define (last-pair l) (let ((tail (cdr l))) (if (null? tail) l (last-pair tail))))And here it is in action:
> (last-pair (list 23 72 149 34)) (34) > (last-pair (list 1 2 3 4)) (4) > (last-pair (list 4 3 2 1)) (1)
If the list passed in is a '()', there would be an error raised: The object (), passed as the first argument to cdr, is not the correct type.
ReplyDeleteUse a cond to avoid that.