在Scheme List中查找重复元素

时间:2015-10-14 00:18:14

标签: recursion scheme

我正试图更熟悉Scheme中的递归。我搜索了问题库,看到许多“内置”函数用于在方案列表中查找重复条目,但我正在尝试设计自己的。我还没有学过“lambda”。我担心的是当我调用递归函数时,car元素将被更新。我希望保持相同,但每次都传递一个新的cdr,因此原始的car元素可以与列表中的每个后续元素进行比较。如果匹配则返回#t,如果没有匹配则返回#f,或者cdr为空(基本情况)。任何帮助/建议将不胜感激。

(define (findDuplicates list)
    (if (null? list)
       #f
       (if (null? (cdr list))
           #f
             (if (= (car list) (getCarOfCdr list)) 
              #t
              (findDuplicates (cdr list))    //trying to use recursion
             )
        )
    )
)


(define (getCarOfCdr list)          //Helper function
  (car (cdr list))
)  

1 个答案:

答案 0 :(得分:1)

您应该使用至少一个内置过程来简化操作:member(这是标准的)。一些一般性的建议:

  • 您不应该调用与具有相同名称的内置函数冲突的参数list
  • 不要那样if,而是使用cond
  • 对于此问题,我们只需要两个基本案例,而不是代码中的三个。
  • getCarOfCdr不是必需的:可以通过调用cadr替换它,此外,它不会起作用:你必须检查每个元素所有剩下的列表 - 这就是您应该使用member
  • 的原因

考虑到以上所有建议,这是我提出的解决方案:

(define (findDuplicates lst)
  (cond ((null? lst) #f)
        ((member (car lst) (cdr lst)) #t)
        (else (findDuplicates (cdr lst)))))

如果使用member并不能满足您的要求,那么它很容易实现,并且比findDuplicates更简单;你应该尝试编写自己的版本,只是为了好玩。