【问题标题】:Racket/Scheme - Applying a function to each element in a list of listsRacket/Scheme - 将函数应用于列表列表中的每个元素
【发布时间】:2016-09-16 20:21:37
【问题描述】:

我是一名物理专业的学生,​​正在上数学课程和编程(我注册了数学),但我以前从未使用任何语言编写过代码,所以关于 Racket 的一切对我来说都是全新的。到目前为止,该类的目标是获取与集合相关的函数并将它们转换为 Racket 程序。其中一个功能是获取列表列表并删除每个元素的第一项:

f({(0, 1, 0), (1, 0, 0), (1, 1, 1)...} = {(1, 0), (0, 0), (1, 1)...}

到目前为止,我已经将其作为一个程序:

(define (procA set)
  (cond
    ((null? set) '())
    ((rest (first set)))
    ((procA (rest set)))))

当我运行程序时,它会返回应用了正确的函数,但只有第一个元素,比如如何

(procA '((0 1 0) (1 0 0) (1 1 1)))

返回为 '(1 0)。它是某种“地图”功能,还是完全不同的东西?我以为最后一行会处理列表的其余部分,但事实并非如此。

【问题讨论】:

  • 是的,应该和(map rest set)一样。

标签: recursion scheme set-theory


【解决方案1】:

正如@uselpa 评论的那样,它与map rest 相同。如果你想实现它,你需要使用递归和cons一起得到结果列表。

我认为最直接的方法是使用if 来查找空列表的基本情况:

(define (procB set)
  (if (null? set)
      '()
      (cons (rest (first set)) (procB (rest set)))))

如果要使用cond,同样可以写成

(define (procC set)
  (cond
    ((null? set) '())
    (else (cons (rest (first set)) (procC (rest set))))))

(在这种情况下不需要else:如果省略,它也将是下面描述的“没有正文的测试表达式”情况。注意我的意思是删除单词else,而不是它后面的表达式.)

也就是说,您的代码中唯一缺少的是cons。在您的代码中,永远不会执行最后一条语句(带有递归),因为cond 选择了第一个为真的测试表达式(而(rest non-empty-list) 是一个“真实”值。类似的示例:

> (cond 
    ((= 1 2) 0)
    ((+ 3 4))
    ((+ 5 6)))
7

第一个测试表达式是假的,所以它继续到第二个,这是真的,因为它没有主体,测试表达式的结果成为cond的结果。第三个测试表达式永远不会执行。

【讨论】:

  • 非常感谢!当我看答案时,这似乎很简单。我将使用这种方法尝试其余的问题。
  • 现在我正在创建一个函数,将每个列表的第一个元素替换为 1(即:f(0, 0, 1) = (1, 0, 1))。一切看起来都和第一个一样,但是我有 ((number? (first (first set)))) (cons 1 (rest (first set)))),而不是 (rest (first set))。我认为这是正确的,但我有一个错误“应用程序:不是过程;期望一个可以应用于给定参数的过程:#t”
  • 您是否正在阅读“如何设计程序”教科书?它为解决此类问题提供了非常可靠的具体步骤。具体来说,您正在研究第 10.1 节“生成列表的函数”:ccs.neu.edu/home/matthias/HtDP2e/…
  • 我应该提一下:“如何设计程序”教科书是由 Racket 团队编写的。在许多方面,Racket 都是专门为处理此文本而设计的。
  • @CompNoob,将后续问题设为新问题,以便您发布完整的过程和问题。作为评论,它有点神秘。一般来说,尝试分而治之:在尝试编写整个过程之前先尝试 REPL 中的各个部分。
【解决方案2】:
(define (exclude list)
  (if (empty? list) '""
  (let ((r (rest list)) (f (rest (first list))))
   (~a f (exclude r))

)))
(exclude '( (3 4 5) ( 6 7 8) ( 9 10 11)))

;(4 5)(7 8)(10 11)

【讨论】:

    猜你喜欢
    • 2015-01-13
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多