我需要編寫一個函數來確定給定列表是否是一對元素。該程序將簡單地迴應#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提到的情況,哪一個是正確的?不要忘記接受它;) –