我的目标是,如果列表或项位于嵌套列表中,则使函数part?返回true。
但到目前为止,我只能让它与一阶列表中的信号项一起工作。(尚未嵌套列表)
(define part?
(lambda (item l)
(and (not (null? l))
(or (= item (car l))
(part? item (cdr l))))))我的目标是
部分?在(A (B))中,(B)A (B)) C)是#f和
部分?(A,B),(C (A,B) (C))是#t
我应该在哪里改进呢?如何使列表与嵌套列表进行比较?
发布于 2009-09-25 14:11:21
免责声明:我已经有20年没有定期写方案了。
我认为您应该从整个lispy/schemey方法的角度来考虑这个问题,即建立您的条件。
给定一个输入item,您希望查找列表是否包含该项目。
我会像这样写代码
(define part? (lambda (item l)
(cond ((null? l) f)
((or (same? item (car l)) (part? item (car l))))
(t (part? item (cdr l)))
)
))
(define same? (lambda (a b) (eq? a b)))我使用cond结构是因为它很适合这种类型的问题-它只是感觉把问题分解出来是正确的-注意null检查。我写的一样吗?作为一个辅助函数,以防你想自己编写它。你可以很容易地这样做:
(define same? (lambda (a b)
(cond ((and (atom? a) (atom? b)) (eq? a b))
((and (list? a) (list? b)) (and (same? (car a) (car b)) (same? (cdr a) (cdr b))))
(f f)
)
))这基本上是说,如果两个项目都是原子,并且它们都是eq,或者它们都是列表,并且汽车是相同的,cdrs是相同的,否则它们是相同的。
你可以很容易地重写相同的代码吗?如下所示:
(define same? (lambda (a b) (equal? a b)))这样做的要点是,代码中存在一个瓶颈-如何确定两个项目是否相同。如果您将该瓶颈分解为它自己的功能,则可以用不同的机制来替换它。我知道您还没有准备好,但您将在某一时刻准备就绪:您还可以重写代码,以便传入谓词。类似这样的东西(以及更多最新的方案程序员,请随时纠正我):
(define part-pred? (lambda (same-pred item l)
(cond ((null? l) f)
((or (same-pred item (car l)) (part? item (car l))))
(t (part? item (cdr l)))
)
))
(define part-eq? (lambda (item l) (part-pred? 'eq? item l)))
(define part-same? (lambda (item l) (part-pred? 'same? item l)))
(define part-equal? (lambda (item l) (part-equal? 'equal? item l)))现在已经将part的概念抽象为一个应用part结构规则的函数和一个由您提供的相等谓词。这使得更改规则变得非常容易。当你点击mapcar时,这会更有意义。
发布于 2009-09-25 13:42:10
这里使用的=函数的问题是,它只为数字定义。要测试任意数据是否相等,可以使用谓词eq?、eqv?和equal?。这里列出了从最有鉴别力(eq?,基本上类似于指针比较)到最不有鉴别力(equal?将考虑类型和结构)的列表。eqv?谓词介于两者之间(对于数字是类型感知的,对于其他任何情况则类似于eq? )。
要比较列表,通常会使用equal?。
可以在R6RS中找到有关这些谓词的编辑详细信息。
发布于 2009-09-25 14:31:32
你的解决方案缺少这个想法,因为你正在处理嵌套列表,你需要检查每个列表中的每一项是否都是列表本身,如果是,那么检查给定列表是其他列表的一部分还是列表其余部分的一部分,如果不是,那么您需要检查第一项是否相等,以及给定列表的其余部分是否是其他列表的一部分。
(define part? item l
(cond (and (list? (car item)) (not (list? (car l))) ...)
(and (not (list? (car item))) (list? (car l)) ...)
(and (not (list? (car item))) (not (list? (car l))) ...)
(and (list? (car item)) (list? (car l))) ...)https://stackoverflow.com/questions/1477312
复制相似问题