Scheme(检查列表,数字和符号的相等性)

时间:2015-10-25 22:54:46

标签: list scheme

我是一个相对较新的方案用户,我正在尝试创建一个能够检查数字,符号和列表(包括嵌套列表)相等的函数。我已尝试过以下代码的多种变体,并且无法提供可行的解决方案;主要的问题是,在遇到嵌套列表后,如果原始列表中有更多元素,程序将不会继续超过该点,并且我不确定如何使该函数适用于列表和数字/符号。任何帮助表示赞赏。

作为一个注释,我在Scheme中的R5RS语言中,我理解这限制了语言的功能。

(define (my-equal? a b)
  (cond ((null? a))
        ((list? (car a))(my-equal? (car a)(car b)))
        ((equal? (car a)(car b))
         (my-equal? (cdr a)(cdr b)))
        (else #f)))

2 个答案:

答案 0 :(得分:1)

我不确定这是否是“我只是想自己实现”这类问题,但在R5RS标准中,equal?的文档说明:

等于?应用eqv,递归地比较对,向量和字符串的内容?在其他对象上,如数字和符号。根据经验,对象通常是相等的?如果他们打印相同的。等于?如果其参数是循环数据结构,则可能无法终止。

所以... equal?已经处理了嵌套列表,向量等的递归检查。

同样,如果你只是对如何实现这样的事情感兴趣,那么不要让我阻止你!

答案 1 :(得分:0)

如果a满足null?,则您不会明确地返回任何内容。但正确的答案是什么?如果你在这种情况下有(null? b),则平等成立。

接下来,假设您可以使用car a并针对list?谓词测试 值。实际上,您首先必须检查a本身是否为列表才能被允许访问其第一个元素。

在接下来的所有条款中,您操纵输入的carcdr,而不是直接使用ab。 当您确定 ab都是列表时,唯一需要使用它们的情况是:如果carcdr,则它们是相同的等于和他们的list?

其他情况不能假设值是列表。相反,当cond (car a)失败时,您确定要处理其他类型的输入。您无法在以下行中调用a而不会出现错误。

然后,您必须提供其他方式来比较bdelete(),如果它们都是数字,字符串或其他类型。