我是一个相对较新的方案用户,我正在尝试创建一个能够检查数字,符号和列表(包括嵌套列表)相等的函数。我已尝试过以下代码的多种变体,并且无法提供可行的解决方案;主要的问题是,在遇到嵌套列表后,如果原始列表中有更多元素,程序将不会继续超过该点,并且我不确定如何使该函数适用于列表和数字/符号。任何帮助表示赞赏。
作为一个注释,我在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)))
答案 0 :(得分:1)
我不确定这是否是“我只是想自己实现”这类问题,但在R5RS标准中,equal?
的文档说明:
等于?应用eqv,递归地比较对,向量和字符串的内容?在其他对象上,如数字和符号。根据经验,对象通常是相等的?如果他们打印相同的。等于?如果其参数是循环数据结构,则可能无法终止。
所以... equal?
已经处理了嵌套列表,向量等的递归检查。
同样,如果你只是对如何实现这样的事情感兴趣,那么不要让我阻止你!
答案 1 :(得分:0)
如果a
满足null?
,则您不会明确地返回任何内容。但正确的答案是什么?如果你在这种情况下有(null? b)
,则平等成立。
接下来,假设您可以使用car
a
并针对list?
谓词测试 值。实际上,您首先必须检查a
本身是否为列表才能被允许访问其第一个元素。
在接下来的所有条款中,您操纵输入的car
和cdr
,而不是直接使用a
和b
。
当您确定 a
和b
都是列表时,唯一需要使用它们的情况是:如果car
是cdr
,则它们是相同的等于和他们的list?
。
其他情况不能假设值是列表。相反,当cond
(car a)
失败时,您确定要处理其他类型的输入。您无法在以下行中调用a
而不会出现错误。
然后,您必须提供其他方式来比较b
和delete()
,如果它们都是数字,字符串或其他类型。