List 双元素列表方案

List 双元素列表方案,list,scheme,zipper,List,Scheme,Zipper,我需要编写一个函数来确定给定的列表是否是一对元素。如果列表正好包含两个元素,程序将简单地响应#t;如果列表不包含两个元素,则响应#f,这样: (zipper? '((a 1)(b 2))) => #t 及 我对这个计划还相当陌生,所以任何帮助都将不胜感激! 谢谢 不清楚该过程的“正确”输入是任意列表还是两元素列表。如果严格地说是两个元素的列表,这将起作用: (define (is-two-element-list? lst) (and (list? lst) (= (l

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

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

我对这个计划还相当陌生,所以任何帮助都将不胜感激! 谢谢

不清楚该过程的“正确”输入是任意列表还是两元素列表。如果严格地说是两个元素的列表,这将起作用:

(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中工作,使用:

如果您未使用Racket,则此解决方案将在任何SRFI解释器中使用:

(require srfi/1)

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

不管是哪种方式,请注意技巧是定义
是两元素列表?
过程,该过程验证两元素列表属性,然后我们可以根据需要应用它。

这样想。如果
拉链
列表是
”()
,则答案是
#t
。如果
拉链
列表不是
”()
,那么如果第一个元素是两个元素,其余的是另一个
拉链?
,则返回
#t

或者你的意思是:

(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

你想检查一个列表是否有两个元素(你说的)或者一个列表是否只包含两个元素列表(你的第二个例子似乎暗示了这一点?我的回答考虑了@molbdnilo提到的两种情况,哪一种是正确的?别忘了接受它;)
(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