编写一个 Scheme 谓词函数来测试两个给定列表的结构相等性。如果两个列表具有相同的列表结构,则它们在结构上是相等的,尽管它们的原子可能不同。
(123) (456) 可以 (1(23))((12)3) 不行
我不知道该怎么做。任何帮助,将不胜感激。
编写一个 Scheme 谓词函数来测试两个给定列表的结构相等性。如果两个列表具有相同的列表结构,则它们在结构上是相等的,尽管它们的原子可能不同。
(123) (456) 可以 (1(23))((12)3) 不行
我不知道该怎么做。任何帮助,将不胜感激。
这里有一些提示。这个写起来有点重复,因为这个问题看起来像家庭作业我会让你填写细节:
(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
有两种方法可以解决这个问题。第一个使用函数生成表示列表结构的输出。
第二种方法是 Oscar 采用的方法,即同时遍历两个列表。在这里,您将两个列表传递给一个函数,该函数执行以下操作:
(and (recur on the first element of both lists) (recur on the rest of both lists))
(recur on the rest of both lists)
。第二种方法在您想要比较两个列表的简单情况下更有效。一旦发现差异,它就会立即返回,只需要完整地处理两个列表,其中两个列表实际上在结构上是相同的。
如果您有大量列表并且可能想要随时比较任意两个列表,则第一种方法可能更有效,因为您可以存储结果,因此任何列表只需要处理一次。它还允许您
不过,我怀疑你的作业最好用第二种方法。