List SCHEME-比较列表并仅返回第二个列表中未显示的值
我在调试这段代码时遇到了困难,希望有人能够帮助我处理伪代码或类似问题的示例。提前谢谢你 定义一个非递归的Scheme过程(remove-them2 lst n),该过程返回列表n中未出现的lst的所有元素的列表 以下是我到目前为止的情况:List SCHEME-比较列表并仅返回第二个列表中未显示的值,list,scheme,racket,List,Scheme,Racket,我在调试这段代码时遇到了困难,希望有人能够帮助我处理伪代码或类似问题的示例。提前谢谢你 定义一个非递归的Scheme过程(remove-them2 lst n),该过程返回列表n中未出现的lst的所有元素的列表 以下是我到目前为止的情况: (define (remove-them2 lst n) (if (null? lst) n (let ((tail (remove-them2 cons((cdr lst) (cdr n))))) (if (member
(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)))))
恐怕您的解决方案中有几个语法错误,请花一些时间研究如何在Scheme中编写过程以及如何调用过程。举几个例子:
- 我们不调用这样的过程:
,正确的方法是cons(…)
(cons…
需要两个参数,但要传递三个参数cons
需要两个参数,但您正在传递一个参数remove-them2
需要两个参数,但要传递三个参数member
- 您构建输出列表的方式不正确
- 我们不需要要求
,我们感兴趣的是检查元素是否是整个(car n)
列表的成员n
- 这里不需要有
变量,直接调用递归更容易;不管怎样,您使用的tail
不正确tail
(define (remove-them2 lst n)
(if (null? lst)
'()
(if (member (car lst) n)
(remove-them2 (cdr lst) n)
(cons (car lst) (remove-them2 (cdr lst) n)))))
编辑:也可以在不使用递归的情况下编写解决方案:
(define (remove-them2 lst n)
(filter (lambda (e) (not (member e n)))
lst))
无论哪种方式,它都能按预期工作:
(remove-them2 '(1 2 3 4 5 6 7) '(1 3 5))
=> '(2 4 6 7)
如果不知道你可以使用哪一种语言,很难合理地回答这个问题 我假设您想要的是非语法递归的东西(因此您不能使用带有累加器的函数:我不确定这个词的正确含义),您可以使用
map
和append
,但不允许使用过滤器,因为这似乎是一个即时的答案
有了这些约束,您可以这样做:
(define (remove-them2 l baddies)
(apply append (map (lambda (e)
(if (memv e baddies)
'()
(list e)))
l)))
我认为这是非常人为的和可怕的,但它可以工作(在像CL这样的语言中,它无法移植工作,这就是为什么我认为它很可怕的原因)。我需要编写一个在解决方案中不使用递归的程序。例如使用地图或类似的东西。嘿@ÓscarLópez,发布的问题确实澄清了“定义一个非递归方案过程”,但你没有做到这一点。您没有帮助修改发布的代码以将其更改为非递归过程,而是将代码重写为递归过程,因此,没有回答问题。@Seudonym--不清楚OP真正想要什么:“我很难调试此代码”适用于OP的递归尝试,这是有效的部分(尽管缺少调试信息)此答案所针对的OP问题。“定义非递归方案过程”是OP尚未尝试的赋值,但如果没有尝试,这将只是一个“编写我的代码”请求。@Seudonym我的答案包括“调试代码”请求,现在还添加了另一个替代解决方案来满足“非递归”要求。否决票是没有根据的。这看起来是递归的。remove-them2
调用remove-them2
。