2014-11-25 1 views
-1

поэтому у меня есть 3 списка.drRacket: относительно списков

(define list1 '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 15 16 17 18 19 20)) 
(define list2 '(2 5 6 8 10)) 
(define list3 '(1 4 8 9 13 15 18 19 20 25 27 29)) 

Так begically, список 1 представляет собой список, который содержит от 1 до 20.

Что я хочу сделать, если я хочу list1 - песни2 = «(1 3 4 6 7 9 11 12 13 14 15 16 17 18 19 20)

или песни1 - песни3 = (2 3 5 6 10 11 12 14 16 17)

Я попытался с длиной списка, но не работает, но Я хочу сохранить все значения list1, кроме дублированных значений, с помощью list3.

также, я хочу сделать list1 - List2 затем сохранить результат от список1-list2 на list1, а затем сделать еще вычитание как,

  1. песни1 - песни2
  2. магазина результат # 1 в списке1.
  3. песни1 - List3

кто может дать мне какое-то решение для этого? Спасибо огромное!

ответ

0

Можем ли мы избавиться от вашего шага 2, «сохранить результат №1 в списке 1»? Такая мутация просто дает мне ульи.

Я думаю, что вы просто пытаетесь удалить элементы из обоих списков 2 и 3 из списка 1. Вы можете сделать это следующим образом:

(remove* (append list2 list3) list1) 

дает ....

'(3 7 11 12 14 16 17) 
+0

Это хороший ответ, но спрашивать пользователя, чтобы изменить способ, которым он пытается объяснить свои идеи, не давая ему подсказку о том, как он должен делать это бесполезно. –

2

Вы работаете с Set Theory? Если это так, (remove *) решает проблему, но это не та процедура, которая описывает разницу в настройках.

разница Set является A \ B определяется по формуле: A\B={x,such that x is in A and x is not in B}

Поэтому вам нужна процедура, которая говорит вам Wheter элемент является in список или нет. Тогда ваш difference код будет выглядеть следующим образом:

(define difference 
    (λ (A B) 
    (remove* (list #f) (map 
    (λ (x) 
     (if (not (in x B)) 
     x 
     #f 
     )) A)))) 

В приведенном выше примере я использую удалить *, и, на мой взгляд, это не очень элегантно, так почему бы не пытаться рекурсию? Это Ракетка в конце :).

(define difference2 
    (λ (A B res) 
    (cond 
     ((empty? A) (reverse res)) 
     ((not (in (car A) B)) (difference2 (cdr A) B (cons (car A) res))) 
     (else (difference2 (cdr A) B res)) 
    ))) 

Обратите внимание, как в difference2 я не сделал использования карт или удаления.

Функция reverse используется на всякий случай, если вы хотите, чтобы результат был заказан.

Проанализируйте оба примера, попытайтесь понять, что я делаю, и опубликуйте свои результаты.

Сообщите нам о любых сомнениях!

EDIT: О и о другой проблеме присвоения значений операции к другой переменной (C++, как), вы можете сделать это очень похоже на C++. : Р

Пример

(define C (sum A B)) 

или

(define foo (+ (* pi x) (* 6 sigma))) 
+0

во втором примере, который вы мне дали, ((нет (в (автомобиль A) B)) (разница 2 (cdr A) B (cons (автомобиль A) res))) <- здесь, рядом нет, «in» не работает. он говорит «несвязанный идентификатор в модуле в: in» ... любая идея? благодаря! –

+0

Да, это несвязано, потому что я хочу, чтобы вы его закодировали. Подумайте об этом, как будто вы ищете конкретную игрушку в коробке, вы забираете ПЕРВОЕ, что вы берете, и ПРОВЕРЬТЕ, если это тот, который вы ищете, если это не так, бросьте его и продолжайте с REST (проверьте [link] (http://docs.racket-lang.org/guide/Lists__Iteration__and_Recursion.html?q=lists)) игрушек в коробке, пока вы не закончите. Дайте нам знать какие-либо сомнения! Также попробуйте ввести код, используя рекурсию, как и во втором примере кода, который я вам дал. –