Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/scheme/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List SCHEME-比较列表并仅返回第二个列表中未显示的值_List_Scheme_Racket - Fatal编程技术网

List SCHEME-比较列表并仅返回第二个列表中未显示的值

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

我在调试这段代码时遇到了困难,希望有人能够帮助我处理伪代码或类似问题的示例。提前谢谢你

定义一个非递归的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 (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