2015-10-14 94 views
0

我试图更熟悉方案中的递归。我已经搜索了这个问题库,并在方案列表中查看了许多用于查找重复条目的“内置”函数,但我试图设计自己的函数。我还没有学会“lambda”。我担心的是当我调用递归函数时,汽车元素将被更新。我希望保持它一样,但每次都要传递一个新的cdr,以便可以将原始汽车元素与列表中的每个后续元素进行比较。如果匹配,我想返回一个#t,如果没有匹配,或者cdr是空的,则返回#f(基本大小写)。任何帮助/建议将不胜感激。在方案列表中查找重复的元素

(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

您应该至少使用一个内置过程使事情更简单:member(这是标准配置)。一些一般性的建议:

  • 你不应该调用参数list,与具有相同名称的内置函数冲突。请使用cond代替。
  • 我们只需要两个基本情况下的这个问题,而不是三个在你的代码。
  • getCarOfCdr是没有必要的:它可以通过向cadr和另外一个电话,这是行不通的更换:你必须检查每个元素对列表的所有的休息 - 这就是为什么你应该使用member

把所有的上述建议纳入考虑,这是我提出的解决方案:

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

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