2010-05-02 68 views
0

編寫一個方案功能,用於從項目列表中刪除給定項目 的第一個頂級事件。 如定列表(A B C)B項,結果列表(C)刪除第一個元素的方案功能

plz幫助我

+0

這是功課嗎?如果是這樣,請標記爲這樣。 – 2010-05-02 11:45:46

回答

0

還有那些功能車和CDR,使您可以採取部分列表。函數追加允許您將兩個列表合併爲一個。我認爲他們可能會來得方便。同時檢查一下cons函數,並確保你理解列表的實際內容,以及它與pair有什麼關係。

舉例如下。拿出你的名單,把第一個元素刪除並檢查它是什麼。如果是被刪除的那個,就丟棄它。如果它不是要刪除的元素,則處理列表的其餘部分,然後在開始處追加該元素。

-1
 
perl2scheme -s \ 
'use strict; sub remove_first { \ 
grep { $_ ne $_[0] || $first++ } @{ $_[1] }; } \ 
print join(",",remove_first("b", ("a","b","c"));' 

執行perl2scheme的一小部分餘下的任務留給讀者作爲excercize。

3

想想你想完成什麼。

你有一個東西的列表,你正試圖刪除某個元素。

example: trying to remove b 
(a a a a b a a b a ...) 
anything before first b should be kept and anything after it also.. 
so we have to spit out from our function: 
a a a a + a a b a ... 

如果我們將這一數字減少到遞歸操作:

at any point looking through the list you can: 

1. inspect element at front of the list and give it out to the result 
    and recursively inspect the rest of the list 
2. stop if you found your element and 
    give out the rest of the list as you've accomplished your task 
0

像這樣的東西(如果它是一門功課):

(define (remove-first-occurence some-list find-symbol accum) 
    (cond 
    [(empty? some-list) accum] 
    [else (cond 
      [(= (first some-list) find-symbol) (cons accum (rest some-list))] 
      [else (remove-first-occurence (rest some-list) find-symbol (cons (first some-list) accum))] 
      )])) 

(remove-first-occurence '(1 2 3 4 3) 3 empty) 
+0

這是clojure嗎?它不是Scheme - 'empty?'不是Scheme函數,Scheme的'='只能用於數字。更重要的是,一個完整的,尾遞歸的答案可能不是一個作業問題的正確答案。 – 2010-05-02 13:19:52

+0

這是一個PltScheme。爲什麼尾遞歸的答案不是一個作業問題的正確答案? – demas 2010-05-02 13:50:05

+0

我認爲Nathan說完整答案並不能幫助人學習或掌握知識 - 它只是給他/她解決方案。 – Egon 2010-05-02 17:40:19

0

(定義(刪除-一線發生列表元素accum) (cond
((null?list)accum) (else (cond ((=(轎廂列表)組件)(利弊ACCUM(CDR列表))) (否則(刪除先occurence(CDR列表)組件(利弊(汽車列表)ACCUM))) ) ) ) )

(除去先occurence「(1 2 3)2」())

1

不知道你想要什麼,而是先用一個指標簡單地啓動它,這是相當多的,你怎麼也得「思考'與計劃,首先開始'如果它是第一個元素?',答案當然是它應該是列表的其餘部分。然後'好的,如果它不是第一個',那麼答案是'它應該首先考慮到對其餘部分應用相同過程的結果',這就是所有信息方案在這方面的需求,並且很多情況下真。

(define (slice-out lst k) 
     (if (<= k 0) (cdr lst) ; if we want to remove the first (0) element, surely the result is simply the tail of the list? 
      (cons (car lst) ; if it's higher than 0, we just cons the first element... 
       (slice-out (cdr lst) (- k 1))))) ; to the result of the same method applied to the tail but with one lower k. 

> (slice-out '(a b c d e) 2) 
===>(a b d e) 

如果列表對索引來說太短,此函數將返回一個錯誤。

但是,如果你想通過一些平等另一個目的是切出來,這個例子就足夠了,我們現在不再切出來的,我們達到0,但如果它等同於搜索例如:

(define (slice-out-by-equality lst search) 
    (if (equal? (car lst) search) (cdr lst) 
     (cons (car lst) 
      (slice-out-by-equality (cdr lst) search)))) 

> (slice-out-by-equality '(a b c d e) 'c) 
===> (a b d e) 

使用相同的原理,但是如果該項不是找到,則返回錯誤。

的一點是,方案具有平等的比較多的口味,所以,我們真正想要的是這樣的:

(define (make-slice-out comparison) 
    (lambda (lst search) 
    (let loop ((lst lst)) 
     (cond 
     ((null? lst) '()) 
     ((comparison (car lst) search) (cdr lst)) 
     (else (cons (car lst) (loop (cdr lst)))))))) 

這個例子說明了什麼計劃是一回事,不知道你是否正在與它知道,但是我們在這裏使用了一個閉包,這個函數實際上將任何二進制比較函數作爲參數,然後求值到你想要的函數,它也被消毒,如果沒有找到,它不會再犯錯誤,它只是簡單地返回它返回舊列表,因爲如果它到達列表的末尾,沒有刪除任何東西,它只是將它再次提交給()。

> ((make-slice-out =) '(1 2 3 6 3) 6) 
===> (1 2 3 3); we just made an anonymous function here. 

但是記住我們最初的功能,我們現在可以定義它只是這樣,供應謂語時「平等的嗎?」我們的新功能其實取值爲我們的老功能(與它現在消毒的重要資產):

(define slice-out-by-equality (make-slice-out equal?)) 

而且,還有更多的二進制比較,這個怎麼樣更奇特的例子:我們

(define slice-out-less-than (make-slice-out <)) 

做函數這個方式,切片指出,嚴格大於我們的搜索詞少的第一個元素,所以這會作用:

> (slice-out-less-than '(573 284 238 174 92 47) 100) 
====> (573 284 238 174 47) 

即使47也小於100,92是第一那些是。

相關問題