0

我是一名物理专业的学生,​​正在学习编程的数学课(我注册了数学),但我以前从未用任何语言编写过代码,所以关于 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)。它是某种“地图”功能,还是完全不同的东西?我以为最后一行会处理列表的其余部分,但事实并非如此。

4

2 回答 2

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. 第三个测试表达式永远不会执行。

于 2016-09-16T20:54:18.143 回答
-1
(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)
于 2019-05-04T13:25:45.740 回答