回答
還有那些功能車和CDR,使您可以採取部分列表。函數追加允許您將兩個列表合併爲一個。我認爲他們可能會來得方便。同時檢查一下cons函數,並確保你理解列表的實際內容,以及它與pair有什麼關係。
舉例如下。拿出你的名單,把第一個元素刪除並檢查它是什麼。如果是被刪除的那個,就丟棄它。如果它不是要刪除的元素,則處理列表的其餘部分,然後在開始處追加該元素。
perl2scheme -s \ 'use strict; sub remove_first { \ grep { $_ ne $_[0] || $first++ } @{ $_[1] }; } \ print join(",",remove_first("b", ("a","b","c"));'
執行perl2scheme的一小部分餘下的任務留給讀者作爲excercize。
想想你想完成什麼。
你有一個東西的列表,你正試圖刪除某個元素。
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
像這樣的東西(如果它是一門功課):
(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)
(定義(刪除-一線發生列表元素accum) (cond
((null?list)accum) (else (cond ((=(轎廂列表)組件)(利弊ACCUM(CDR列表))) (否則(刪除先occurence(CDR列表)組件(利弊(汽車列表)ACCUM))) ) ) ) )
(除去先occurence「(1 2 3)2」())
不知道你想要什麼,而是先用一個指標簡單地啓動它,這是相當多的,你怎麼也得「思考'與計劃,首先開始'如果它是第一個元素?',答案當然是它應該是列表的其餘部分。然後'好的,如果它不是第一個',那麼答案是'它應該首先考慮到對其餘部分應用相同過程的結果',這就是所有信息方案在這方面的需求,並且很多情況下真。
(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是第一那些是。
- 1. 當刪除最後一個元素,jquery刪除第一個元素
- 2. Vuex僅刪除第一個元素
- 3. 刪除3元素元組的第一個元素
- 4. 刪除雙打功能(方案)
- 5. 如何刪除第一個元素並使第二個元素成爲java.util.NavigableSet中的第一個元素?
- 6. 如何添加一個帶有刪除功能的元素
- 7. 方案:如何刪除/刪除矢量中的元素
- 8. 雙鏈表爲什麼不能刪除第一個元素
- 9. 刪除除n個第一個元素之外的所有元素
- 10. 如何刪除所有元素除jQuery中的第一個元素和第二個元素?
- 11. 在javascript中創建第2個html元素刪除第一個
- 12. 刪除解決方案後功能未被刪除
- 13. 刪除每個子元素除了第一個孩子嗎?
- 14. 刪除除PHP第一個之外的所有列表元素?
- 15. 在球拍列表中刪除第n個元素的功能版本
- 16. Javascript刪除一個元素
- 17. jQuery:刪除第二個匹配元素
- 18. 具有一個參數的方案功能,它將每兩個元素交換
- 19. Jquery-刪除每個節點的第一個元素
- 20. 移除QMap的5個第一元素
- 21. javascript只刪除每一個第二個元素
- 22. NSArray:刪除每個元素,但第一個20
- 23. 需要#t但得到第一個元素(方案)
- 24. 獲取矢量第一個元素方案
- 25. @OrderColumn映射 - 刪除列表中的第一個元素錯誤
- 26. 如何刪除用戶控件的第一個元素?
- 27. 如何刪除數組中元素值的第一個實例?
- 28. array_shift不刪除數組的第一個元素
- 29. 在Scala中刪除列表的第一個元素
- 30. 只刪除jquery選擇中的第一個元素
這是功課嗎?如果是這樣,請標記爲這樣。 – 2010-05-02 11:45:46