Two Element List Scheme

613 views Asked by At

I need to write a function that determines if the given list is a pair of elements. The program will simply respond #t if the list contains exactly two elements or #f if it does not, such that:

(zipper? '((a 1)(b 2))) => #t

and

(zipper? '((foo 100)(bar 2 3))) => #f

I'm still fairly new to Scheme so any help would be much appreciated! Thanks!

2

There are 2 answers

0
Óscar López On BEST ANSWER

It isn't clear if the "correct" input for the procedure is an arbitrary list or a two-element list. If it's strictly a two-element list, this will work:

(define (is-two-element-list? lst)
  (and (list? lst)
       (= (length lst) 2)))

(define (zipper? lst)
  (and (is-two-element-list? lst)
       (is-two-element-list? (first lst))
       (is-two-element-list? (second lst))))

… And if it's an arbitrary-length list whose elements we want to check, this will work in Racket, using andmap:

(define (zipper? lst)
  (andmap is-two-element-list? lst))

If you are not using Racket, then this solution using every will work in any interpreter with SRFIs:

(require srfi/1)

(define (zipper? lst)
  (every is-two-element-list? lst))

Either way, notice that the trick was defining the is-two-element-list? procedure, which verifies the two-element-list property, after that we can apply it as needed.

0
GoZoner On

Think of it this way. If the zipper list is '() then the answer is #t. If the zipper list is not '() then if the first element is two elements and the rest is another zipper?, then return #t.

(define (zipper? list)
  (or (null? list)
      (and (= 2 (length (car list)))
           (zipper? (cdr list)))))

or maybe you mean:

(define (zipper? list)
  (or (not (pair? list))
      (and (= 2 (length list))
           (zipper? (list-ref list 0))
           (zipper? (list-ref list 1)))))

every element, at any level, has two elements.

> (zipper? '((a 1 2) '(b)))
#f
> (zipper? '(a b))
#t
> (zipper? '(((a (b b)) c) (1 2)))
#t