将一个简单列表与一个列表与Racket中的子列表进行比较

时间:2018-05-03 16:32:45

标签: list racket

如何将一个简单列表与包含三个或更多子列表的列表进行比较,并获得两个与列表匹配最多的子列表?我知道我的代码是完全错误的但有人可以帮助我吗?

以下是我如何定义包含子列表的列表:

(define db (list '('green 'blue 'yellow 'orang)
             '('black 'blue 'darkblue 'white)
             '('brown 'red 'turkos 'pink)))

简单列表:

(define indata '('green 'blue ))

代码:

(define (compare lst database)
  (define (compare-help lst database result)
    (cond
      ((null? database) result)
      ((equal? (car lst) (car (car database)))
       (cons (car database) result))
       (else
        (compare-help  (lst (cdr database) result))))
  (compare-help lst database '())))

 > (compare indata db)

我希望输出如下:

('green 'blue 'yellow 'orang) ('black 'blue 'darkblue 'white))

2 个答案:

答案 0 :(得分:0)

第一个问题是您的输入数据不正确。

比较dbdb2db3的输出。

#lang racket

(define db (list '('green 'blue 'yellow 'orang)
                 '('black 'blue 'darkblue 'white)
                 '('brown 'red 'turkos 'pink)))

(define db2 '((green blue yellow orange)
              (black blue darkblue white)
              (brown red turkos pink)))


(define db3 (list (list 'green 'blue 'yellow   'orange)
                  (list 'black 'blue 'darkblue 'white)
                  (list 'brown 'red  'turkos   'pink)))

db
db2
db3

输出:

'(('green 'blue 'yellow 'orang) ('black 'blue 'darkblue 'white) ('brown 'red 'turkos 'pink))
'((green blue yellow orange) (black blue darkblue white) (brown red turkos pink))
'((green blue yellow orange) (black blue darkblue white) (brown red turkos pink))

带走:引用'不等同于list

答案 1 :(得分:0)

  1. 如何将一个简单列表与包含三个或更多子列表的列表进行比较,并获得两个与列表匹配最多的子列表?

  2. 如何将一个简单列表与包含三个或更多子列表的列表进行比较,并获取匹配 简单列表<的两个子列表< / em> most

  3. 如何处理包含三个或更多列表的列表,并取回匹配给定列表最多的两个<?>?< / p>

  4. 如何处理清单? - by Recursion!

    (define (process lst)
        (apply (lambda (a . d)    ; a is the "car"
                   (process d))   ; d is the "cdr"
               lst))
    

    湾但是如果lst是空的怎么办? - 处理此案例!

    (define (process lst)
      (cond
        ((null? lst) 'WE_ARE_DONE!)
        (else
          (apply (lambda (a . d)    ; a is the "car"
                     (process d))   ; d is the "cdr"
                 lst))))
    
  5. 好的,但我在这里什么也没做。我如何用每个元素做某事? - 添加内部定义并使用它们:

    (define (process lst)
      (define result #f)
      (define (do-something-with a) 
         (set! result a))
      (define (ok-now-really-do-it lst)
        (cond
          ((null? lst) 'WE_ARE_DONE!)
          (else
            (apply (lambda (a . d)    ; a is the "car"
                     (do-something-with a)
                     (ok-now-really-do-it d))   ; d is the "cdr"
                 lst))))
      (ok-now-really-do-it lst))
    
  6. 大!我似乎已经实现了last-elem函数,尽管它总是告诉我WE_ARE_DONE。我可以修复它,可以使用map使用更简单的代码来执行此操作吗? - 是的,map非常相似,也遍历输入列表并将函数应用于其中的每个值:

    (define (process lst)
      (define result #f)
      (define (do-something-with a) 
         (set! result a))
      (map do-something-with 
           lst)
      result)
    
  7. 嗯,我们确实可以使用map,而不是所有手写的“处理”内容。大。但是我们从来没有谈过匹配,对吗? - 这样的东西?

    (define (list-matches lst mylist)
      (define result '())
      (define (do-something-with a) 
         (set! result (insert a (matches a)
                              result)))
      (define (matches a)
         (sum (map (lambda (word) 
                      (if (word-present-in word mylist)
                          0
                          1))
                   a)))                       
      (map do-something-with lst)
      (first-two-of result))
    
  8. word-present-in?我们怎么找到这个?通过process mylist,不是吗?

      (define (word-present-in word mylist)
         ....
         ....   (if (equal word a)
         ....     .... )
         .... )
    
  9. 好。我们已经覆盖了三分之一的方式。或者可能是季度。你能继续前进吗?实现我们在这里使用的新名称越来越多,根据我们如何使用它们,可能会添加实现新的名称? p>

    首先,您的insert会将a及其匹配计数插入排序顺序中的result,以便在你将把前两个放在最后,那些将是最匹配的