2014-11-25 46 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的列表 - list2中=「(1 3 4 6 7 9 11 12 13 14 15 16 17 18 19 20)

,或者 list1的 - 項目list3 =(2 3 5 6 10 11 12 14 16 17)

我試圖與該列表的長度,但沒有工作,但我想保留除list3以外的所有list1值。

也,我想要做的 列表1 - 列表2然後,結果從列表1列表1,列表2存儲,然後做另一個減法一樣,

  1. 列表1 - 列表2
  2. 店#1的結果在list1中。
  3. 列表1 - 項目list3

任何人都可以給我一些這方面的解決方案?非常感謝!

回答

0

我們可以擺脫第2步,「將#1的結果存儲在列表1中」嗎?這種突變給我帶來了麻疹。

我覺得你只是想刪除這兩份清單2和3從清單1中的元素你可能不喜歡這樣:

(remove* (append list2 list3) list1) 

產量....

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

這是一個很好的答案,但是要求用戶更改他試圖不給他的,他應該怎麼做一個提示,解釋他的想法的方式它是無用的。 – 2014-11-25 15:48:56

2

你在使用Set Theory嗎?如果是這樣,(remove *)解決了這個問題,但它不是描述集合差異的過程。

集不同的是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函數用於防止您要求對結果進行排序。

分析這兩個例子,試着理解我在做什麼併發布你的結果。

讓我們知道任何懷疑!

編輯: 哦,對另一個變量(C++等)分配一個操作的值的其他問題,你可以做到這一點非常像C++。 :P

(define C (sum A B)) 

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

在你給我的第二個例子中, ((not(in(car A)B))(difference2(cdr A)B(cons(car A)res)))< - 這裏,旁邊沒有, 「in」不起作用。它說:「模塊中的未綁定標識符:在......」任何想法?謝謝! – 2014-11-26 02:15:59

+0

是的,因爲我想讓你編碼,所以它沒有被綁定。想想看,就像你在一個盒子裏尋找一個特定的玩具一樣,你拿起第一個東西抓住並檢查它是否是你正在尋找的東西,如果它不是,扔掉它並繼續使用REST(檢查[鏈接](http://docs.racket-lang.org/guide/Lists__Iteration__and_Recursion.html?q=lists)),直到你完成。讓我們知道任何疑問! 也嘗試使用遞歸進行編碼,就像我給你的代碼的第二個例子。 – 2014-11-26 18:12:40