[英]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.