[英]Recursion/Lists in Racket
我正在嘗試創建函數remove-member
,其中我有一個字符串列表,我將字符串的成員之一(即"A"
)提供給函數,它會刪除該成員並返回列表的其余部分沒有那個成員。 目前我已經創建了測試並開始了我的功能,但我已經迷失了。 我知道遞歸函數包括列表的第一個成員和它的其余部分,但我將如何刪除字符串的第一個成員?
(define str (list->string (list 'A 'B 'C)))
(check-expect (remove-occurrences "A") (list 'B 'C))
(check-expect (remvove-occurrences '()) (list 'A 'B 'C))
(define (remove-occurrences r)
(cond
[(empty? r) str]
[(??? r)]))
要從列表中刪除單個元素:
或者,要從列表中刪除所有出現的元素:
這些功能有何不同:
> (remove-one '(a b b c) 'b)
'(a b c)
> (remove-all '(a b b c) 'b)
'(a c)
讓我們按照數據類型。
通過這種方式,我們可以自動為我們處理平凡的任務,並將我們的創造性思維能力集中在我們問題中更有趣、更不常見的方面:
(define (list-p ad)
(cond
((null? ad) ; follow
#t)
((pair? ad)
(let ((a (car ad)) ; the
(d (cdr ad))) ; type!
(list-p d)))
(else #f)))
我們可以將此謂詞視為布爾值的構造函數。 按照相同的示例(即骨架代碼)創建列表也很容易:
(define (list-l ad)
(cond
((null? ad) ; return proper
(list)) ; type here, and
((pair? ad)
(let ((a (car ad))
(d (cdr ad)))
(list-l d))) ; here
(else #f)))
我們剛剛遵循了該類型的骨架代碼,在幾個適當的地方對其進行了修改,並得到了一個可以自己創建正確類型值的工作代碼!
但它是否創造了任何有趣的價值,完全使用提供的參數? 顯然,不是。 為此,我們必須修改遞歸調用:
(define (list-copy ad)
(cond
((null? ad)
(list))
((pair? ad)
(let ((a (car ad))
(d (cdr ad)))
(cons ... ; here
(list-copy d))
))
(else #f)))
現在您可以進一步調整它,根據您的問題要求有條件地使用 pair 的第一個元素。
(注意: null?
在你的方言中可以稱為empty?
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.