我需要编写一个函数来确定给定列表是否是一对元素。该程序将简单地回应#T如果列表中只包含两个元素或#F如果没有,这样的:两个元素列表方案
(zipper? '((a 1)(b 2))) => #t
和
(zipper? '((foo 100)(bar 2 3))) => #f
我还是相当新的计划,因此任何帮助将不胜感激! 谢谢!
我需要编写一个函数来确定给定列表是否是一对元素。该程序将简单地回应#T如果列表中只包含两个元素或#F如果没有,这样的:两个元素列表方案
(zipper? '((a 1)(b 2))) => #t
和
(zipper? '((foo 100)(bar 2 3))) => #f
我还是相当新的计划,因此任何帮助将不胜感激! 谢谢!
不清楚过程的“正确”输入是任意列表还是双元素列表。如果它是严格意义上的两个元素的列表,这将工作:
(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?
过程,验证两个元素列表属性,之后我们可以根据需要应用它。
想想这样。如果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
你想检查列表是否恰好有两个元素(你说的)或列表是否只包含两个元素的列表(其中第二个例子似乎暗示? – molbdnilo
我的回答既考虑的@molbdnilo提到的情况,哪一个是正确的?不要忘记接受它;) –