문제

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!

도움이 되었습니까?

해결책

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.

다른 팁

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top