【问题标题】:Scheme (Checking equality for lists, numbers and symbols)Scheme(检查列表、数字和符号的相等性)
【发布时间】:2015-10-26 13:30:55
【问题描述】:

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

请注意,我使用的是 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)))

【问题讨论】:

    标签: list scheme


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      接下来,您假设您可以获取acar 并针对list? 谓词测试that 值。实际上,您首先必须检查a 本身是否是一个列表,以便被允许访问它的第一个元素。

      在所有下一个子句中,您操作输入的carcdr,而不是直接使用ab。 唯一需要使用它们的情况是当您确定 both ab 是列表时:那么,如果它们的 car 相等且它们的 cdr 相等,它们就相等也是。

      其他情况不能假定值是列表。相反,当list? 在您的cond 中失败时,您确定您正在处理另一种输入。您不能在以下行中调用 (car a) 而不会出现错误。

      那么,如果ab 都是数字、字符串或其他类型,则必须提供其他方法来比较它们。

      【讨论】:

      • 谢谢,这很有帮助!
      猜你喜欢
      • 1970-01-01
      • 2016-05-16
      • 2010-12-07
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      相关资源
      最近更新 更多