使用scheme查找两个字符串在结构上是否相等

时间:2012-11-13 01:59:33

标签: function scheme conditional

编写一个Scheme谓词函数,用于测试两个给定列表的结构相等性。如果两个列表具有相同的列表结构,则它们在结构上是相等的,尽管它们的原子可能不同。

(123)(456)没问题 (1(23))((12)3)不好

我不知道该怎么做。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

以下是一些提示。这个有点重复写,因为问题看起来像家庭作业我会让你填写细节:

(define (structurally-equal l1 l2)
  (cond ( ? ; if both lists are null
         #t)
        ( ? ; if one of the lists is null but the other is not
         #f)
        ( ? ; if the `car` part of both lists is an atom
         (structurally-equal (cdr l1) (cdr l2)))
        ( ? ; if the `car` part of one of the lists is an atom but the other is not
         #f)
        (else
         (and (structurally-equal ? ?)     ; recur over the `car` of each list
              (structurally-equal ? ?))))) ; recur over the `cdr` of each list

答案 1 :(得分:0)

有两种方法可以解决这个问题。第一个使用函数生成表示列表结构的输出。

  1. 考虑一种可以将任何列表的结构表示为唯一字符串或数字的方式,这样任何具有相同结构的列表都具有相同的表示形式,而没有其他列表会生成相同的输出。
  2. 编写一个分析任何列表结构的函数并生成该输出。
  3. 通过该功能运行两个列表并比较输出。如果相同,它们具有相同的结构。
  4. 第二个是奥斯卡采取的方法,是同时重复这两个名单。在这里,您将两个列表都传递给一个函数,即:

    1. 第一个列表的第一个元素是否与第二个元素的第一个元素相同(结构上)?如果没有,请返回false。
    2. 这些是第一个元素列表吗?如果是,请返回(and (recur on the first element of both lists) (recur on the rest of both lists))
    3. 的结果
    4. 如果不是,请返回(recur on the rest of both lists)
    5. 的结果

      在您想要比较两个列表的简单环境中,第二种方法更有效。一旦发现差异,它就会立即返回,只需完整处理两个列表,其中两个列表确实在结构上完全相同。

      如果您有大量的列表集,并且可能希望在任何时候比较任何两个列表,那么第一种方法可以更高效,因为您可以存储结果,因此任何列表只需要处理一次。它还允许你

      • 组织您的列表集合,例如,创建一个哈希映射,将具有相同结构的所有列表组合在一起。
      • 比较结构的相似性的列表(例如,这些列表是否以相同的结构开始和/或结束,即使它们在中间不同?)
      但是,我怀疑你的作业最好用第二种方法服务。