首页 > 解决方案 > SCHEME - 比较列表并仅返回未出现在第二个列表中的值

问题描述

我很难调试这段代码,并希望有人能够帮助处理伪代码或类似问题的示例。提前谢谢你!

定义一个非递归 Scheme 过程(remove-them2 lst n) ,它返回lst中所有未出现在列表 n 中的元素的列表。

这是我到目前为止所拥有的:

(define (remove-them2 lst n)
  (if (null? lst)
     n
     (let ((tail (remove-them2 cons((cdr lst) (cdr n)))))
      (if (member (car lst) (car n) tail)
          tail
          (cons (car lst) (car n) tail)))))

标签: listschemeracket

解决方案


在不知道您被允许使用的语言的哪个子集的情况下,很难合理地回答这个问题。

我假设你想要一些不是语法递归的东西(所以你不能使用带有累加器的函数:我不确定这个词的正确含义),你可以使用mapand append,但是你'不允许使用filter,因为这似乎是一个直接的答案。

有了这些限制,您可以这样做:

(define (remove-them2 l baddies)
  (apply append (map (lambda (e)
                       (if (memv e baddies)
                           '()
                           (list e)))
                     l)))

我认为这是非常人为和可怕的,但它可以工作(在像 CL 这样的语言中它不能移植工作,这就是为什么我认为它很可怕)。


推荐阅读