【问题标题】:How to look for an element in a list of lists in racket如何在球拍列表中查找元素
【发布时间】:2018-03-04 06:02:15
【问题描述】:

我正在尝试在列表列表中查找一个元素并打印包含该元素的列表。

对于测试:(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)))

但是这段代码给了我一条错误消息,上面写着:

if: 语法错误; 在关键字 in 之后有 4 个部分:(if (equal?table null) (quote ()) (cons (search-table first table item)) (search-table rest table item))

请帮我解决这个问题,因为我是 Racket 的新手。

【问题讨论】:

    标签: recursion functional-programming racket tail-recursion


    【解决方案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))
    

    但是那个结果是 reverse 顺序的;无论如何,根据您的问题 - 我们可以使用延续作为我们的累加器而不是列表来“修复”该问题

    (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))
    

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多