2010-12-15 59 views
2
(define (delete atm lis) 
    (cond 

    ((eq? atm (car lis)) (cdr lis)) 
    (else (cons (car lis) (delete atm (cdr lis)))))) 

(delete 'a '(b c d a)) 
(delete 'the '(the more you practice the better you will be)) 
(delete 'cat '((dog cat) mouse cat (elephant) (cat) cat)) 
(delete 'rainy '(the weather can be (rainy) sunny cloudy and cold)) 

我想輸出是Scheme如何從列表中刪除元素?

  1. (BCD)
  2. (你練習得越多就越會是)
  3. ((狗貓)鼠標(大象)(CAT))
  4. (氣候可能(雨天)晴天陰天和冷)

但有很多錯誤,請幫助我,謝謝

回答

1

你實際上並沒有刪除任何東西。您的程序通常被稱爲remq

以下應工作(未經測試):

(define (delete atm lis) 
    (cond 
    ((null? lis) lis) 
    ((eq? atm (car lis)) (delete atm (cdr lis))) 
    (else (cons (car lis) (delete atm (cdr lis)))))) 
+0

但是如果我想找到的原子不是列表中的第一個元素,它仍然有錯誤。你能告訴我爲什麼嗎? – Lilo 2010-12-15 15:33:43

+1

@Lilo:你最好告訴我們什麼是「錯誤的」,因爲leppie的答案是正確的。 – erjiang 2010-12-16 02:25:28

0

你需要一個基本情況,甚至當你找到你想要的自動取款機,你還願意繼續通過列表遞歸。

(define (delete atm lis) 
    (cond 
    ((null? lis) '()) 
    ((eq? atm (car lis)) (delete atm (cdr lis))) 
    (else (cons (car lis) (delete atm (cdr lis)))))) 
+0

哎呀抱歉,這跟leppie's一樣。我測試了這個,它工作。 – user479988 2010-12-15 16:13:39

1

另外兩個答案(順便說一句)目前只能在列表的頂層工作。如果你也希望它從所有嵌套列表中刪除您的原子,你必須得有搜索:

(define (delete atm lis) 
(cond 
    ((null? lis) lis) 
    ((eq? atm (car lis)) (delete atm (cdr lis))) 
    ((list? (car lis)) (cons (delete atm (car lis)) (delete atm (cdr lis)))) 
    (else (cons (car lis) (delete atm (cdr lis)))))) 

如果這不是你想要的,也許你可以指定它到底是什麼這是怎麼了。你一直在說某件事或許多事情是錯誤的,但沒有具體說明它是什麼。例如,你可以指定你期望的四個例子的輸出結果。