编写一个Scheme谓词函数,用于测试两个给定列表的结构相等性。如果两个列表具有相同的列表结构,则它们在结构上是相等的,尽管它们的原子可能不同。
(123)(456)没问题 (1(23))((12)3)不好
我不知道该怎么做。任何帮助将不胜感激。
答案 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)
有两种方法可以解决这个问题。第一个使用函数生成表示列表结构的输出。
第二个是奥斯卡采取的方法,是同时重复这两个名单。在这里,您将两个列表都传递给一个函数,即:
(and (recur on the first element of both lists) (recur on the rest of both lists))
(recur on the rest of both lists)
。在您想要比较两个列表的简单环境中,第二种方法更有效。一旦发现差异,它就会立即返回,只需完整处理两个列表,其中两个列表确实在结构上完全相同。
如果您有大量的列表集,并且可能希望在任何时候比较任何两个列表,那么第一种方法可以更高效,因为您可以存储结果,因此任何列表只需要处理一次。它还允许你