我正在尝试在列表列表中找到一个元素,并打印包含该元素的列表。
对于测试:(搜索表'((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)))
但是这段代码给了我一条错误信息,上面写着:
if:语法错误; 关键字后有4个部分:( if(equal?table null)(quote())(cons(search-table first table item))(search-table rest table item))
请帮我这个,因为我是Racket的新手。
答案 0 :(得分:1)
如果值是列表的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))
你用 tail-recursion 标记了这个,所以让我们用恒定的空间来做
(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))
您使用 functional-programming 标记了这一点,所以让我们使用更高阶函数
(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))