List 方案比较项目或列表(如果为');测试列表中的(可以嵌套)
我的目标是使函数List 方案比较项目或列表(如果为');测试列表中的(可以嵌套),list,scheme,List,Scheme,我的目标是使函数part?在嵌套列表中有列表或项目时返回true 但到目前为止,我只能让它在一阶列表中处理信号项。(尚未嵌套列表) 我的目标是 部分?在(A(B))中,((B)A(B))C)是#f和 部分?(A)B,(C(A)B(C))中的 我应该在哪方面改进?如何使列表与嵌套列表进行比较 这里使用的=函数的问题是,它只为数字定义。要测试任意数据是否相等,有谓词eq?、eqv?、和equal?。这里列出的是最有区别的( EQ?,基本上像指针比较)到最小辨别(相等?< /代码>将考虑类型和结构)。
part?
在嵌套列表中有列表或项目时返回true
但到目前为止,我只能让它在一阶列表中处理信号项。(尚未嵌套列表)
我的目标是
部分?在(A(B))中,((B)A(B))C)是#f和
部分?(A)B,(C(A)B(C))中的
我应该在哪方面改进?如何使列表与嵌套列表进行比较 这里使用的
=
函数的问题是,它只为数字定义。要测试任意数据是否相等,有谓词eq?
、eqv?
、和equal?
。这里列出的是最有区别的(<代码> EQ?,基本上像指针比较)到最小辨别(<代码>相等?< /代码>将考虑类型和结构)。eqv?
谓词介于两者之间(数字的类型识别,否则类似于eq?
的任何其他类型)
要比较列表,通常使用equal?
Edit有关这些谓词的详细信息可以在中找到。这里使用的
=
函数的问题是,它仅为数字定义。要测试任意数据是否相等,有谓词eq?
、eqv?
、和equal?
。这里列出的是最有区别的(<代码> EQ?,基本上像指针比较)到最小辨别(<代码>相等?< /代码>将考虑类型和结构)。eqv?
谓词介于两者之间(数字的类型识别,否则类似于eq?
的任何其他类型)
要比较列表,通常使用equal?
编辑有关这些谓词的详细信息,请参见。免责声明:我已经20年没有定期编写计划了 我认为您需要从整个lispy/schemey方法的角度来考虑这个问题,即建立您的条件 给定一个输入项,您希望查找列表是否包含该项
(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结构,是因为它非常适合这类问题——解决问题感觉不错——注意空检查。我也写过?作为帮助函数,以防您自己编写。您也可以通过以下方式轻松完成:
(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)
)
))
这基本上是说两个项目是相同的,如果它们都是原子,它们是相等的,或者它们都是列表,汽车是相同的,CDR是相同的,否则是错误的
你可以同样轻松地重写吗?因此:
(define same? (lambda (a b) (equal? a b)))
这样做的意义在于代码中存在一个瓶颈——如何确定两个项目是否相同。如果您将瓶颈分解为它自己的功能,您可以用不同的机制来替换它。我知道您还没有到这里,但您将在某一点上:您还可以重写代码,以便传入谓词。类似的内容(以及更多最新的scheme程序员,请随时纠正我):
现在,它将part的概念抽象为一个应用part结构规则和您提供的相等谓词的函数。这使得改变规则变得非常容易。当您点击mapcar时,这将更有意义。免责声明:我已经20年没有定期编写计划了 我认为您需要从整个lispy/schemey方法的角度来考虑这个问题,即建立您的条件 给定一个输入项,您希望查找列表是否包含该项
(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结构,是因为它非常适合这类问题——解决问题感觉不错——注意空检查。我也写过?作为帮助函数,以防您自己编写。您也可以通过以下方式轻松完成:
(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)
)
))
这基本上是说两个项目是相同的,如果它们都是原子,它们是相等的,或者它们都是列表,汽车是相同的,CDR是相同的,否则是错误的
你可以同样轻松地重写吗?因此:
(define same? (lambda (a b) (equal? a b)))
这样做的意义在于代码中存在一个瓶颈——如何确定两个项目是否相同。如果您将瓶颈分解为它自己的功能,您可以用不同的机制来替换它。我知道您还没有到这里,但您将在某一点上:您还可以重写代码,以便传入谓词。类似的内容(以及更多最新的scheme程序员,请随时纠正我):
现在,它将part的概念抽象为一个应用part结构规则和您提供的相等谓词的函数。这使得改变规则变得非常容易。当您点击mapcar时,这将更有意义。您的解决方案没有考虑到这一点,因为您处理的是嵌套列表,您需要检查每个列表中的每个项目是否都是列表本身,如果是,则检查给定列表是否是其他列表的一部分,如果不是,则需要检查第一个项目是否相等,以及