【问题标题】:Finding duplicate elements in a Scheme List在方案列表中查找重复元素
【发布时间】:2016-01-11 21:54:15
【问题描述】:

我正在尝试更加熟悉 Scheme 中的递归。我已经搜索了问题库并看到了许多“内置”功能,用于在方案列表中查找重复条目,但我正在尝试设计我自己的。我还没有了解“lambda”。我担心的是当我调用递归函数时,汽车元素会被更新。我希望保持不变,但每次都传递一个新的 cdr,因此可以将原始 car 元素与列表中的每个后续元素进行比较。如果匹配,我想返回 #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))
)  

【问题讨论】:

    标签: recursion scheme


    【解决方案1】:

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

    • 您不应该调用参数list,这会与同名的内置函数发生冲突。
    • 不要这样嵌套ifs,而是使用cond
    • 对于这个问题,我们只需要两个基本案例,而不是您的代码中的三个。
    • getCarOfCdr 不是必需的:它可以通过调用 cadr 来代替,此外,这是行不通的:您必须对照 列表的所有其余部分检查每个元素 - 这就是为什么你应该使用member

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 2010-10-10
      • 2014-04-21
      • 1970-01-01
      • 2015-08-08
      • 2021-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多