我们如何编写将两个列表合并在一起的函数?

时间:2016-07-06 00:10:42

标签: list merge racket

我想回答的问题是: 编写一个名为merge的函数(在Dr.Racket / Scheme中),从两个玩具列表(玩具1和玩具2)中生成玩具列表。这个产生的清单将有玩具1和玩具2的交替玩具,第一个值来自玩具1。此外,如果玩具1和玩具2中的第n个玩具是相同的玩具(颜色和类型),则生成的列表应该仅包含具有该颜色和类型的一个玩具结构(例如,不复制)。如果列表具有不同的长度,则列表中的最后一个k玩具将是较长列表中的最后一个k玩具。

使用以下结构来完成此问题:

(define-struct toy (color type))
;; A Toy is a (make-toy Str Str)

该计划的一个例子是:

(merge (list (make-toy "blue" "ball") (make-toy "blue" "spring") 
   (make-toy "red" "helmet") (make-toy "purple" "band"))
   (list (make-toy "yellow" "van") (make-toy "blue" "spring")))

产生

(list (make-toy "blue" "ball") (make-toy "yellow" "van")
  (make-toy "blue" "spring") (make-toy "red" "helmet")
  (make-toy "purple" "band"))

现在,我创建的程序如下:

(define (merge toys1 toys2)
  (cond
     [(empty? toys1) toys2]
     [(empty? toys2) toys1]
     [else
         (first toys1) (first toys2)
         (merge (rest toys1) (rest toys2))]))

现在我遇到的问题是我不知道如何在最终生成的列表中包含删除重复的条件。 任何建议都会对我有帮助!

1 个答案:

答案 0 :(得分:0)

在我看来,有两种方法可以摆脱重复:

  1. 在您构建列表时,请确保您没有重复值。如果你这样做,将会发生的事情是,通过不插入重复的值,并在列表中插入下一个值,你搞砸了两个列表交错的顺序。但与此同时,您也要确保获得正确的交替清单。
  2. 在您构建完列表之后,请仔细检查并删除重复项。这可以通过调用当前函数merge-help然后创建一个函数merge来完成。从merge-help生成的列表中删除重复项。这样做会更容易实现,但是不能保证您的列表符合要求,即它可能没有正确交错。
  3. 解决方案1肯定更乏味但它会给你更好的结果。我的建议是首先从名为remove-dups的函数中删除任一列表中的重复项或类似的东西。然后,在新更改的列表中,如果您遵循soegaard's建议,请实施您当前的merge,这似乎会起作用。