【问题标题】:SCHEME- comparing lists and returning only the values that do not appear in the second listSCHEME-比较列表并仅返回未出现在第二个列表中的值
【发布时间】:2020-06-22 17:25:54
【问题描述】:

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

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

【问题讨论】:

  • 这看起来是递归的。 remove-them2 致电remove-them2

标签: list scheme racket


【解决方案1】:

恐怕您的解决方案中有几个语法错误,请花点时间研究如何在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)

【讨论】:

  • 我需要编写一个在解决方案中不使用递归的程序。例如使用地图或类似的东西。
  • 嘿@ÓscarLópez,发布的问题确实澄清了“定义非递归方案过程”,您没有这样做。您没有帮助修改发布的代码以将其更改为非递归过程,而是将代码也重写为递归,因此,没有回答问题。
  • @Seudonym -- 不清楚 OP 真正想要什么:“我很难调试这段代码”适用于 OP 的递归尝试,这是有效的部分该答案解决的OP问题(尽管缺乏调试信息)。 “Define a non-recursive Scheme procedure”是 OP 尚未尝试的分配,但在没有尝试的情况下,这将只是一个“写我的代码”请求。
  • @Seudonym 我的回答涵盖了“调试代码”请求,现在还添加了另一种替代解决方案来满足“非递归”要求。否决票是没有根据的。
【解决方案2】:

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

我假设你想要的东西在语法上不是递归的(所以你不能使用带有累加器的函数:我不确定这个词的正确性),你可以使用 @987654321 @ 和 append,但你不能使用 filter,因为这似乎是一个直接的答案。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多