【发布时间】:2010-12-29 02:36:58
【问题描述】:
这个问题来自htdp 的练习 17.6.5。我需要一些关于如何确定一对符号在列表列表中是否唯一的指导。
这是我到目前为止所得到的:
;; pair : symbol, list of symbols -> list of list of symbols
;; an auxiliary function that returns a list of possibly non-unique
;; lists of pairings from a name (symbol) and a list of names (list of symbols).
;; output from (pair 'Alice '(Bob Charlie))
;; (list
;; (list 'Alice 'Bob) (list 'Bob 'Alice) (list 'Alice 'Charlie)
;; (list 'Charlie 'Alice) (list 'Bob 'Charlie) (list 'Charlie 'Bob))
(define (pair name alist)
(cond
[(empty? alist) empty]
[(cons? alist) (append (pair name (first alist))
(pair name (rest alist))
(pair (first alist) (rest alist)))]
[else (list (append (list name)(list alist))
(append (list alist)(list name)))]))
如果将此函数应用于问题(5 个名称),它将产生 30 个符号对列表,其中 10 个是重复的。删除它们的适当方法是什么?在其他语言中,解决此问题的一种方法是通过创建数据结构来引入副作用,并将每个项目插入到该结构中,但前提是它尚未在其中。
我考虑过排序,但意识到我无法对符号进行排序,因为我只能测试是否相等,所以我几乎被困在这里,希望有任何见解。
编辑: 我添加了“不同”的函数定义,它使用名称(符号)并生成对列表。
(define (non-same name alist)
(cond
[(empty? alist) empty]
[(equal? name (first (first alist))) (cons (first alist) (non-same name (rest alist)))]
[else (non-same name (rest alist))]))
以下测试通过:
(non-same 'Mary (pair 'Mary '(Jane Laura Dana Louise)))
;; outputs (list (list 'Mary 'Jane) (list 'Mary 'Laura) (list 'Mary 'Dana) (list 'Mary 'Louise))
看来我是在正确的轨道上。不幸的是,我似乎是偶然发现了解决方案,现在我必须思考它是如何工作的,哈哈。
感谢所有阅读此问题的人,尤其感谢 Chris 提供的帮助。
【问题讨论】:
-
不行,这里还是有问题。当 Chris 告诉您使用前面定义的“安排”时,他是绝对正确的。它会生成名称列表的所有可能排列,并且与您的“对”函数不同。除其他外,它接受不同数量的参数。如果你在我的班上,我会很迂腐,坚持要你按照设计秘诀;你错过了一大堆步骤。
-
约翰,感谢您的意见。是的,我的“配对”功能是不了解所需内容的结果,实际上是复杂的。部分原因是我不明白“安排”的输出应该代表一个循环链表,所以不需要一个“对”函数来代表一个给予者-接受者对。