1

我需要编写一个函数来确定给定列表是否是一对元素。如果列表恰好包含两个元素,则程序将简单地响应 #t 或如果不包含则响应 #f,例如:

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

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

我对Scheme还是很陌生,所以任何帮助都将不胜感激!谢谢!

4

2 回答 2

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?过程,它验证二元素列表属性,然后我们可以根据需要应用它。

于 2014-01-29T00:55:36.560 回答
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
于 2014-01-29T00:59:59.240 回答