Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 方案比较项目或列表(如果为');测试列表中的(可以嵌套)_List_Scheme - Fatal编程技术网

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方法的角度来考虑这个问题,即建立您的条件

给定一个输入项,您希望查找列表是否包含该项

  • 如果列表不为空,则列表可能包含项

  • 如果列表中的汽车与该项目匹配,或者列表中的汽车包含该项目,则列表包含该项目

  • 如果列表的cdr包含某个项目,则列表包含该项目

  • 最后一个问题要考虑的是,(a?(a)b(a))(

    )的结果是什么? 我会这样写代码

    (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方法的角度来考虑这个问题,即建立您的条件

    给定一个输入项,您希望查找列表是否包含该项

  • 如果列表不为空,则列表可能包含项

  • 如果列表中的汽车与该项目匹配,或者列表中的汽车包含该项目,则列表包含该项目

  • 如果列表的cdr包含某个项目,则列表包含该项目

  • 最后一个问题要考虑的是,(a?(a)b(a))(

    )的结果是什么? 我会这样写代码

    (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时,这将更有意义。

    您的解决方案没有考虑到这一点,因为您处理的是嵌套列表,您需要检查每个列表中的每个项目是否都是列表本身,如果是,则检查给定列表是否是其他列表的一部分,如果不是,则需要检查第一个项目是否相等,以及