用于检查列表是否重复的Scheme函数

时间:2012-03-06 12:05:52

标签: list recursion duplicates scheme workflow

我需要编写一个Scheme函数来检查列表中的重复条目。我想我的工作流程已经完成了,我只需要帮助将它从纸上传到代码中。

首先,我需要检查它是否为空列表。所以我有......

(define (checkDupe mylist)
  (if (null? mylist)
      ()
      (checkDupeB mylist)
  )
)

然后我有这种“双递归”,我在列表的其余部分检查第一个数字,然后在列表的其余部分检查第二个数字,依此类推,当它找到匹配时,它会吐出#t,如果它到达终点并且找不到匹配项,则函数的结果为#f。问题是我无法绕过这个递归的东西。这是一个家庭作业问题,但我对这些东西很感兴趣。

有人可以向我抛出一些代码并帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:3)

这是一种方式

(define (has-duplicates? lst) 
  (cond
     [(empty? lst) #f] 
     [(not (not (member (first lst) (rest lst)))) #t]
     [else (has-duplicates? (rest lst)) ])) 

答案 1 :(得分:1)

我猜这是功课。这是一个简单的过程,但您在导航流中缺少一个案例,因为需要考虑三个案例:

  1. 如果列表为空,会发生什么?这意味着它没有任何重复
  2. 如果列表的当前元素存在于列表的其余部分,会发生什么?那么这意味着列表中有一个副本(提示:member过程可能有用)
  3. 如果以上都不是,请继续使用下一个元素
  4. 作为进一步的帮助,这里是一般的想法,填写空白:

    (define (checkDupe mylist)
      (cond ((null? myList) ???) ; case 1
            (??? #t)             ; case 2
            (else ???)))         ; case 3
    

答案 2 :(得分:1)

为每个成员再次遍历整个列表以检查重复项可能很昂贵 - O(n ^ 2)。检查相邻的重复项要便宜得多 - O(n)。如果您不介意更改列表中元素的顺序,可以先通过对列表进行排序来使所有重复项相邻。该列表必须由可以通过某些>进行比较的元素组成。操作

(define (remove-duplicates xs)
  (fold-right cons-if-not-duplicate '() (sort xs >)))

这种方法的一个优点是它依赖于标准的折叠运算符而不是自定义递归。由于这是作业,我忽略了cons-if-not-duplicate的定义。

答案 3 :(得分:0)

解决问题的方法不止一种。这是建议。

  1. 编写辅助函数(is-element-in-list?x l), 如果x在列表l中,则返回true,否则返回false。

  2. 填写

    中的空白
    (define (contains-duplicate? l)
       (cond [(list? l) (or <check whether (first l) is in (rest l)>
                            <check where (rest l) contains a duplicate> )
             [else false]))
    

答案 4 :(得分:0)

这是我的解决方案,虽然未经测试可行,但

ci_session=xxxx

大声算法:   如果初始车等于下一辆车?首先砍掉然后再去,否则,保留它,然后继续。这样我们只保留唯一的副本,而不是任何与邻居兄弟相关的副本