List 检查列表中是否存在重复项的Scheme函数

List 检查列表中是否存在重复项的Scheme函数,list,recursion,duplicates,scheme,workflow,List,Recursion,Duplicates,Scheme,Workflow,我需要编写一个Scheme函数来检查列表中的重复条目。我想我已经把工作流程写在纸上了,我只是需要帮助把它从纸上变成代码 首先,我需要检查它是否是一个空列表。所以我有 (define (checkDupe mylist) (if (null? mylist) () (checkDupeB mylist) ) ) 然后我有一种“双重递归”,我检查第一个数字与列表的其余部分,然后检查第二个数字与列表的其余部分,依此类推,当它找到一个匹配项时,它会吐出一个#t,如果它到

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

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

(define (checkDupe mylist)
  (if (null? mylist)
      ()
      (checkDupeB mylist)
  )
)
然后我有一种“双重递归”,我检查第一个数字与列表的其余部分,然后检查第二个数字与列表的其余部分,依此类推,当它找到一个匹配项时,它会吐出一个
#t
,如果它到达末尾但没有找到匹配项,函数的结果就是
#f
。问题是我就是不能把我的脑袋放在这个递归的东西上。这是一个家庭作业问题,但我对学习这些东西很感兴趣


有人能帮我写些代码吗?

我猜这是家庭作业。这是一个简单的过程,但您在导航流程中遗漏了一个案例,因为需要考虑三个案例:

  • 如果列表为空,会发生什么?这意味着里面没有任何重复的东西
  • 如果列表的当前元素存在于列表的其余部分中,会发生什么情况?然后它意味着列表中有一个重复项(提示:
    member
    过程可能有用)
  • 如果以上都不正确,请继续执行下一个元素
  • 作为进一步的帮助,以下是总体思路,请填空:

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

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

  • 编写一个助手函数(是列表中的元素?x l), 如果x在列表l中,则返回true,否则返回false

  • 填空

    (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]))
    
    (定义(包含重复的?l)
    (条件[(列表?l)(或
    )
    [否则为假])
    

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

    (define (remove-duplicates xs)
      (fold-right cons-if-not-duplicate '() (sort xs >)))
    
    这种方法的一个优点是它依赖于一个标准的折叠操作符而不是自定义的递归。因为这是我的家庭作业,所以我省略了
    cons的定义,如果不重复的话

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

    这是我的解决方案,虽然未经测试应该有效

    (define rmdup
       (lambda list
          (cond
             ((null? list) '())
             ((eq? (car list) (car (cdr list)) (rmdup(cdr list)))
              (else( cons (car list) (rmdup(cdr list)))))))
    
    大声说出来:
    如果第一辆车与下一辆车相等?切掉首字母再继续,否则,保留它,然后继续。这样我们只保留唯一的副本,而不保留与邻居兄弟姐妹的任何副本

    您可能想看看《如何设计程序》第二版的草稿,特别是从第4章开始:。该章介绍了如何系统地批准要理解递归,你只需要理解计数。我们用自然数来计数。什么是自然数?它不是0,就是比自然数多一个。在一个炎热干旱的沙漠中。你知道附近每个城市的方向;你如何决定去哪里?你想找到最近的一个。你怎么知道你知道离一个城市有多远而不去那里吗?你是一个向导;你创建一个你自己的副本,离那个城市更近一步,然后问它答案。因为他也是一个向导,他重复这个过程。我修正了你的格式,但我认为这不起作用。(提示:(rmdup'(1 2 3 1))返回什么?