我正试图更熟悉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))
)
答案 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
更简单;你应该尝试编写自己的版本,只是为了好玩。