【问题标题】:Processing Two Complex Inputs (removing lists of duplicate symbols in a list)处理两个复杂输入(删除列表中重复符号的列表)
【发布时间】: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 告诉您使用前面定义的“安排”时,他是绝对正确的。它会生成名称列表的所有可能排列,并且与您的“对”函数不同。除其他外,它接受不同数量的参数。如果你在我的班上,我会很迂腐,坚持要你按照设计秘诀;你错过了一大堆步骤。
  • 约翰,感谢您的意见。是的,我的“配对”功能是不了解所需内容的结果,实际上是复杂的。部分原因是我不明白“安排”的输出应该代表一个循环链表,所以不需要一个“对”函数来代表一个给予者-接受者对。

标签: scheme racket


【解决方案1】:

通过阅读问题,我有一种感觉,你在找错树了。

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

我从你的问题推测你想要实现non-same。您将需要实现一个传递给filter(或任何等效的HtDP)的函数。那么,就这么简单:

(define (non-same names arrangements)
  (define (usable? arrangement)
    ...)
  (filter usable? arrangements))

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

我希望这是一个足够的提示。如果您需要其他提示,请询问。 :-)

【讨论】:

  • 克里斯,你是对的,我需要实现不同的。 “pair”功能类似于“arrangements”;它需要一个名称并从中产生组合。我会更新我的帖子以反映我的意思,因为 cmets 有字符数限制。
猜你喜欢
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多