簡體   English   中英

如何在球拍列表中查找元素

[英]How to look for an element in a list of lists in racket

我正在嘗試在列表列表中查找一個元素並打印包含該元素的列表。

對於測試:(search-table '((1 2 3) (4 2) (3 3 4) (5 3 2 1)) 1),輸出為:

'((1 2 3) (5 3 2 1))

到目前為止,這是我在 DrRacket 中的代碼:

(define (search-table table item)
  (if(equal? table null)
  '()
    (cons(search-table first table item))(search-table rest table item)))

但是這段代碼給了我一條錯誤消息,上面寫着:

如果:語法錯誤; 關鍵字 in 后有 4 個部分:(if (equal? table null) (quote ()) (cons (search-table first table item)) (search-table rest table item))

請幫我解決這個問題,因為我對 Racket 很陌生。

如果該值是一個member列表的, cons列表到結果

(define (search-table lists value)
  (cond ((null? lists) '())
        ((member value (car lists)) 
           (cons (car lists) (search-table (cdr lists) value)))
        (else (search-table (cdr lists) value))))

(search-table '((a b c d) (b c) (c d e f) (a b c)) 'a)
;; '((a b c d) (a b c))

你用尾遞歸標記了這個,所以讓我們用恆定的空間來做

(define (search-table lists value)
  (let loop ((lists lists) (acc null))
    (cond ((null? lists) acc)
          ((member value (car lists)) 
             (loop (cdr lists) (cons (car lists) acc)))
          (else (loop (cdr lists) acc)))))

(search-table '((a b c d) (b c) (c d e f) (a b c)) 'a)
;; '((a b c) (a b c d))

但結果是相反的順序; 無論如何,根據您的問題 - 我們可以“修復”使用延續作為我們的累加器而不是列表

(define (search-table lists value)
  (let loop ((lists lists) (acc identity))
    (cond ((null? lists)
           (acc null))
          ((member value (car lists))
           (loop (cdr lists) (lambda (rest)
                               (acc (cons (car lists) rest)))))
          (else
           (loop (cdr lists) acc)))))

(search-table '((a b c d) (b c) (c d e f) (a b c)) 'a)
;; '((a b c d) (a b c))

你用函數式編程來標記它,所以讓我們使用高階函數來做

(define (search-table lists value)
  (filter (lambda (list) (member value list))
          lists))

(search-table '((a b c d) (b c) (c d e f) (a b c)) 'a)
;; '((a b c d) (a b c))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM