我需要编写一个函数来确定给定列表是否是一对元素。如果列表恰好包含两个元素,程序将只响应#t,如果不包含,则响应#f,例如:
(zipper? '((a 1)(b 2))) => #t
和
(zipper? '((foo 100)(bar 2 3))) => #f
我还是相当新的Scheme,所以任何帮助都将不胜感激! 谢谢!
答案 0 :(得分: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))))
...如果它是一个任意长度的列表,我们要检查其元素,这将在Racket中使用andmap
:
(define (zipper? lst)
(andmap is-two-element-list? lst))
如果您不使用Racket,那么使用every
的此解决方案将适用于任何具有SRFI的解释器:
(require srfi/1)
(define (zipper? lst)
(every is-two-element-list? lst))
无论哪种方式,请注意诀窍是定义is-two-element-list?
过程,它验证了双元素列表属性,之后我们可以根据需要应用它。
答案 1 :(得分: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