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