所以,我正在嘗試撰寫一個帶有兩個引數的函式,一個嵌套的數字 L 串列和一個數字 n。如果數字 n 屬于任何串列,則該函式回傳 true,否則回傳 false。
例如, (sob35 '((1 2 3) (5 4) (6 7) (8 9 10 11)) 8) 回傳 true 并且 (sob35 '((1 2 3) (5 4) (6 7) (8 9 10 11)) 22) 回傳假。
我使用rest使用成員函式對此進行了測驗,看看它是否會檢查6是否是嵌套串列的成員,
(member 6 ((rest '((1 2 3) (5 4) (6 7) (8 9 10 11))))) it returned
application: not a procedure;
expected a procedure that can be applied to arguments
given: '((5 4) (6 7) (8 9 10 11)) what i had given it was indeed a list
(define sob35
(lambda ( l1 l2 )
(for/list ([ L l1 ] [ N l2 ])
(if ( member N (rest (L))) "True" "False"))))
我不認為我有正確的想法,因為我認為如果 N 是 L 的成員它應該回傳 true 否則它應該回傳 false ,盡管當我運行它時
(sob35 '((1 2 3) (5 4) (6 7) (8 9 10 11)) 8)
. . application: not a procedure;
expected a procedure that can be applied to arguments
given: '(1 2 3)
我不明白應用程式錯誤試圖暗示;它應該列出一個串列
uj5u.com熱心網友回復:
使用一個for/or過List of Lists輸入,來實作所需要的......
(define two-sequences
(lambda (l1 l2)
(for/or ([N l1])
(and (member l2 N) #t))))
測驗
racket@> (define two-sequences (lambda (l1 l2) (for/or ([N l1]) (and (member l2 N) #t))))
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 6)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 16)
#f
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 8)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 10)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 3)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 12)
#f
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 1)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 2)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 3)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 4)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 5)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 6)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 7)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 8)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 9)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 10)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 11)
#t
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 12)
#f
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 13)
#f
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 14)
#f
racket@> (two-sequences '((1 2 3) (5 4) (6 7) (8 9 10 11)) 15)
#f
racket@>
這個怎么樣...
(member 6 (rest '((1 2 3) (5 4) (6 7) (8 9 10 11))))
在最初的通話中,就像...
(member 6 ( (rest '((1 2 3) (5 4) (6 7) (8 9 10 11))) ))
;;^ ;; ^
評估function application后得到處理。(rest ...)
(let ((result-of-evaluation-of-rest (rest '((1 2 3) (5 4) (6 7) (8 9 10 11)))))
(member 6 (result-of-evaluation-of-rest)))
whereresult-of-evaluation-of-rest不是函式,而是串列。而我們真正想要的是...
(let ((result-of-evaluation-of-rest (rest '((1 2 3) (5 4) (6 7) (8 9 10 11)))))
(member 6 result-of-evaluation-of-rest))
uj5u.com熱心網友回復:
您需要一個member以嵌套方式作業的函式。在 lisp 傳統中,它將被稱為- 因為它是(用于平面串列)member*的遞回作業形式。member
(define (member*? nested-list element (test equal?))
(cond ((null? nested-list) #f)
((list? (car nested-list)) (or (member*? (car nested-list) element test)
(member*? (cdr nested-list) element test)))
((test (car nested-list) element) #t)
(else (member*? (cdr nested-list) element test))))
因為嵌套可以任意深而遞回不是,所以可以使用尾遞回函式。
(define (member*? nested-list element (test equal?) (acc #f))
(cond ((null? nested-list) acc)
((list? (car nested-list)) (member*? (cdr nested-list) element test
(or acc (member*? (car nested-list) element test))))
((test (car nested-list) element) #t)
(else (member*? (cdr nested-list) element test acc))))
uj5u.com熱心網友回復:
一個簡單的“for 回圈”答案可能特定于“串列串列”引數。可以使用問題中參考的
Racket's :for/fold
(define (member-of-sub-list? lols x)
(for/fold ([result #f])
([ls lols])
(or result (not (not (member x ls))))))
;(member-of-sub-list? '((1) (2 3 4)) 3) => #t
;(member-of-sub-list? '((1) (2 3 4)) 99) => #f
但是,在學習Scheme 或 Racket 時,系統地開發這樣的功能是有幫助的。
首先,撰寫一個帶有簽名和目的的存根函式,以及簡單的測驗:
(define (member-of-sub-list? lolox x) ;; (ListOf ListOfX) X -> Boolean
;; produce whether x occurs in sub-lists of lolox
#f)
(check-expect (member-of-sub-list? '(()) 0) #f)
(check-expect (member-of-sub-list? '((0)) 0) #t)
然后使用示例和 標準模板 填寫函式,并測驗:
(define (member-of-sub-list? lolox x) ;; (ListOf ListOfX) X -> Boolean
;; produce whether x occurs in sub-lists of lolox
(cond
[(empty? lolox) #f ]
[(member x (first lolox)) #t ]
[else (member-of-sub-list? (rest lolox) x) ]))
(check-expect (member-of-sub-list? '((1) (2 3 4) ()) 0) #f)
(check-expect (member-of-sub-list? '((1) (2 0 4) ()) 0) #t)
for/fold(與閱讀和理解檔案相比,撰寫此解決方案所需的時間更少)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/461266.html
上一篇:使用for回圈構建Numpy陣列
