Сравнение простого списка со списком с подсписками в Racket - PullRequest
0 голосов
/ 03 мая 2018

Как я могу сравнить один простой список со списком, который содержит три или более подсписков, и получить два подсписка, которые больше всего соответствуют списку? Я знаю, что мой код совершенно неверный, но может ли кто-нибудь мне помочь?

Вот как я определил список, который содержит подсписки:

(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 голосов
/ 03 мая 2018
  1. Как можно сравнить один простой список со списком, который содержит три или более подсписков, и получить два подсписка, которые больше всего соответствуют списку?

  2. Как можно сравнить один простой список со списком, который содержит три или более подсписка, и получить два подсписка, которые соответствуют простой список большинство ?

  3. Как мне обработать список, содержащий три или более списков в нем, и вернуть два, которые соответствуют данному списку наибольшему числу ?

  4. Как мне обработать список? - по рекурсии!

    (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. Great! Кажется, я реализовал функцию 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)
         ....     .... )
         .... )
    

Ну. Мы прошли около трети пути. Или, может быть, четверть. Вы можете пойти дальше? Реализуйте все больше и больше тех новых имен, которые мы использовали здесь, возможно добавляя и внедряя новых по мере необходимости, в соответствии с как мы их использовали ?

Во-первых, ваш insert будет вставлять a вместе с его количеством совпадений в result в порядке сортировки , так что когда вы возьмете первые два в конце , это будут наиболее подходящие .

0 голосов
/ 03 мая 2018

Первая проблема в том, что ваши входные данные неверны.

Сравните выходные данные db, db2 и db3.

#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.

...