方案:该代码有什么问题?

时间:2014-12-28 12:42:08

标签: scheme

我写了这段代码来删除重复,这是有效的。但是,当我为相同功能添加选项时,存在问题。我能做什么?? 谢谢!!

(define (remove-dups ls eq)
  (if (null? ls) '()
      (cons (car ls) (remove-dups (deepRemove (car ls) (cdr ls) eq)))))

(define (deepRemove n L eq)
  (if (null? L) '()
  (if (list? (car L))
      (cons (deepRemove n (car L) eq) (deepRemove n (cdr L) eq))
      (if (eq? n (car L))(deepRemove n (cdr L) eq)
          (cons (car L)(deepRemove n (cdr L) eq))))))

1 个答案:

答案 0 :(得分:2)

您的代码至少有两个错误。首先,您将错误数量的参数传递给remove-dups。其次,您实际上并未使用eq中的deepRemove参数。此外,您应该使用cond而不是嵌套if,但这更像是一种风格问题。试试这个:

(define (remove-dups ls eq)
  (if (null? ls)
      '()
      (cons (car ls)
            (remove-dups (deepRemove (car ls) (cdr ls) eq) eq)))) ; fixed

(define (deepRemove n L eq)
  (if (null? L)
      '()
      (if (list? (car L))
          (cons (deepRemove n (car L) eq)
                (deepRemove n (cdr L) eq))
          (if (eq n (car L)) ; fixed
              (deepRemove n (cdr L) eq)
              (cons (car L)
                    (deepRemove n (cdr L) eq))))))

只要您通过适当的eq程序并考虑到需要比较的所有可能值,上述操作就会起作用,请注意这一点。