2016-07-06 49 views
-2

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

使用以下结构来完成这样一个问题:

(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

对不起,但这看起来像一个家庭作业的要求,这不是StackOverflow的。请自己尝试解决,如果遇到麻烦,那么您可以寻求解决问题的帮助。 –

+0

好的,谢谢你让我知道! – Mark

+0

其实,家庭作业还行,[但](http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions)你应该先尝试自己解决问题然后询问您现有的实施情况。 – Noumenon

回答

0

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

  1. 当你正在构建的列表中,你要确保你是不是在重复值推杆。如果你这样做,将会发生的是,通过不插入重复的值并将下一个值插入到列表中,可能会混淆交错两个列表的顺序。但同时,你也确保你得到一个适当的交替列表。
  2. 在您构建完列表后,仔细检查并删除重复项。可以通过调用当前函数merge-help,然后创建一个函数merge来删除merge-help生成的列表中的重复项。这样做会更容易实现,但不能保证您的列表能够满足要求,即不能正确交错。

解决方案1绝对更繁琐,但它会给你更好的结果。我的建议是首先从一个名为remove-dups的函数中删除任何一个列表中的重复项或者其他类型的项。然后在新更改的列表中,执行您当前的merge,如果您遵循soegaard's的建议,这看起来好像会起作用。

相关问题