【问题标题】:removing elements from a list in Scheme从 Scheme 中的列表中删除元素
【发布时间】:2012-11-13 01:57:46
【问题描述】:

这是我第一次发帖,我对计划有疑问。 我必须从列表中删除所有出现的元素,同时作为参数传递, 输入这样的参数时:

]=> (rmobject '(1 2 3 5 0 2 3 5 3) 3)

我收到一个错误:

The object (3 5 3 2 3 6 3) is not applicable

我想是因为第二个 lambda 不能正常工作,但为什么?

(define (rmobject list1 obj)
  (if (null? list1)
      '() 
       (if (= obj (car list1))
           ((lambda (list1) (cdr list1)) list1)
           ((lambda (list1) (list1)) list1)))
        (cons (car list1) (rmobject (cdr list1) obj)))

我重写了代码,这在删除元素时可以正常工作,但正确的不能,并且两者都假设相同。提前致谢

(define (rmobject list1 obj)
  (if (null? list1)
     '() 
  (if (= obj (car list1))
      (rmobject (cdr list1) obj)
      (cons (car list1) (rmobject (cdr list1) obj)))))

【问题讨论】:

  • ((lambda (list1) (list1)) list1))) 将导致该错误

标签: list lisp scheme element removeall


【解决方案1】:

代码中的第一个版本没有多大意义。为什么要这样使用lambdas?您应该递归调用 相同 正在定义的过程,而不是创建一次性匿名过程,这将无法解决手头的问题。而这部分:(list1) 导致错误The object is not applicable:您正试图调用列表,就好像它是一个过程一样 - 因为它被括号包围。请记住,在 Scheme 中,像这样的语法:(foo) 表示要调用 foo 过程

您的代码的第二个版本很好,这是实现remove-all 过程的简单方法。不过,有点吹毛求疵:当您发现自己在嵌套ifs 时,这肯定表明cond 会更合适。另请注意,使用equal? 而不是= 是个好主意,这样您的程序将不仅仅适用于数字:

(define (rmobject list1 obj)
  (cond ((null? list1)
         '())
        ((equal? obj (car list1))
         (rmobject (cdr list1) obj))
        (else
         (cons (car list1)
               (rmobject (cdr list1) obj)))))

供将来参考:您正在实施的过程通常包含在解释器中。例如,在 Racket 中,我们有 remove*,它使用 equal? 作为测试相等性的默认过程:

(define (rmobject list1 obj)
  (remove* (list obj) list1))

此外,您可以使用filter,就像@Maxwell 的回答一样。另一种写法:

(define (rmobject list1 obj)
  (filter (negate (curry equal? obj)) list1))

无论如何,这行得通:

(rmobject '(1 2 3 5 0 2 3 5 3) 3)
=> '(1 2 5 0 2 5)

【讨论】:

    【解决方案2】:

    问题在于,在((lambda (list1) (list1)) list1))) 行中,您编写了一个接受参数 (list1) 的函数,然后您尝试将其作为函数调用。因为该函数实际上是传递了一个列表,所以解释器退出并出现错误。

    正如您在第二次尝试中发现的那样,使用您提出的算法通过 lambda 组合函数是不必要的,甚至是连贯的。尽管如此,有许多技术比您在第二次尝试中使用的技术要简单得多。我将演示一个实际使用 lambda 的方法,以便您了解它是如何工作的。我所指的替代技术依赖于filter,其工作原理如下:

    (define (rmobject list1 obj)
      (filter (lambda (x) (not (equal? x obj))) list1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多