我是一名物理专业的学生正在参加数学课程(我参加了数学课程),但我以前从未用任何语言编写过代码,所以关于Racket的一切对我来说都是全新的。到目前为止,该类的目标是采用与集相关的函数并将它们转换为Racket程序。其中一个功能是获取列表列表并删除每个元素的第一项:
f({(0,1,0),(1,0,0),(1,1,1)......} = {(1,0),(0,0),(1, 1)...}
到目前为止,我已将此作为一个程序:
undefined
当我运行程序时,它会返回正确的函数,但只有第一个元素,如何
(define (procA set)
(cond
((null? set) '())
((rest (first set)))
((procA (rest set)))))
回到了(1 0)。是某种" map"功能还是完全不同的东西?我认为最后一行会处理列表的其余部分,但它没有。
答案 0 :(得分: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
选择第一个为true的test-expression(而(rest non-empty-list)
是一个“truthy”值。类似的例子:
> (cond
((= 1 2) 0)
((+ 3 4))
((+ 5 6)))
7
其中第一个test-expression为false,因此它继续到第二个,这是真的,并且由于它没有body,测试表达式的结果将成为cond
的结果。第三个测试表达式永远不会执行。
答案 1 :(得分:-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)