2014-01-28 66 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