处理两个复杂输入(删除列表中重复符号的列表)

时间:2010-12-29 02:36:59

标签: scheme racket

这个问题来自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个是重复的。删除它们的适当方法是什么?在其他语言中,解决此问题的一种方法是通过创建数据结构并将每个项目插入到结构中来引入副作用,但前提是它不在其中。

我考虑过排序,但意识到我无法对符号进行排序,因为我只能测试相等性,所以我几乎被困在这里,并且非常感谢任何见解。

编辑: 我添加了我的函数定义“non-same”,它使用了一个名称(符号)并生成了一对列表。

(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))

所以我似乎走在了正确的轨道上。不幸的是,似乎我已经通过偶然性来达到了解决方案,现在必须将我的大脑包裹在它的工作原理中。

感谢所有阅读此问题的人,尤其感谢克里斯的有用评论。

1 个答案:

答案 0 :(得分:0)

通过阅读问题,我感觉你正在咆哮错误的树。

您只需要三个功能:random-picknon-samearrangements。最后一个已在练习12.4.2中定义。

我从您的问题中假设您要实施non-same。您将需要实现一个传递给filter的函数(或者等效的HtDP)。然后,它就像:

一样简单
(define (non-same names arrangements)
  (define (usable? arrangement)
    ...)
  (filter usable? arrangements))

(当然,请填写...。该函数只需要返回一个布尔值,你根本不必触摸append(正如你在问题中所做的那样)。)

我希望这已经足够了。如果您需要其他提示,请询问。 : - )