2014-01-28 7 views
1

Мне нужно написать функцию, которая определяет, является ли данный список парой элементов. Программа будет просто реагировать #t, если список содержит ровно два элемента или #F, если это не так, что:Схема списка элементов

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

и

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

Я все еще довольно новый Схеме поэтому любой помощь будет очень признательна! Спасибо!

+0

Вы хотите, чтобы проверить, есть ли список ровно два элемента (что вы говорите) или содержит ли список только списки два-элементов (которые ваш второй пример, кажется, подразумевает? – molbdnilo

+0

Мой ответ принимает во внимание оба случаи, упомянутые @molbdnilo, который был правильным? и не забудьте принять его;) –

ответ

1

Неясно, является ли «правильный» вход для процедуры произвольным списком или двухэлементным списком. Если это строго список двухэлементного, это будет работать:

(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)))) 

... И если это список произвольной длины, элементы которого мы хотим проверить, что это будет работать в рэкете, используя andmap:

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

Если вы не используете рэкет, то это решение с помощью every будет работать в любом переводчика с SRFIs:

(require srfi/1) 

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

в любом случае, обратите внимание, что трюк был defin в процедуре is-two-element-list?, которая проверяет свойство двух элементов, после чего мы можем применить его по мере необходимости.

0

Думайте об этом таким образом. Если список zipper равен '(), тогда ответ будет #t. Если список zipper не равен '(), то если первым элементом является два элемента, а остальное - еще один zipper?, затем верните #t.

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

или, может быть, вы имеете в виду:

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

каждый элемент, на любом уровне, состоит из двух элементов.

> (zipper? '((a 1 2) '(b))) 
#f 
> (zipper? '(a b)) 
#t 
> (zipper? '(((a (b b)) c) (1 2))) 
#t 
Смежные вопросы