List 如何返回列表列表中的所有元素?(公共小巴计划)
比如说,, 如果输入为: (名单(名单1)(名单2)(名单3)) 输出将是: (列表1 2 3) 为什么这个代码不起作用List 如何返回列表列表中的所有元素?(公共小巴计划),list,recursion,scheme,racket,List,Recursion,Scheme,Racket,比如说,, 如果输入为: (名单(名单1)(名单2)(名单3)) 输出将是: (列表1 2 3) 为什么这个代码不起作用 (define (listoutput mylist) (cond [(empty? mylist) empty] [(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))])) (check-expect (listoutput (list (list 1) (lis
(define (listoutput mylist)
(cond
[(empty? mylist) empty]
[(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))]))
(check-expect (listoutput (list (list 1) (list 2) (list 3)))
(list 1 2 3)
事实上你很接近。以下是一些可能有帮助的问题: listoutput的合同/签名是什么 附加的合同/签名是什么 另外,我建议您首先构建最简单的示例,每个示例都基于前面的示例。比如说,
(check-expect (listoutput empty)) ???)
(check-expect (listoutput (cons (list 1) empty)) ???)
如果第一个测试通过,但第二个测试失败,那么根据函数的结构,这意味着问题在哪里
[(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))]))
那行有两个错误。最明显的是,它应该是
(第一个mylist)
,而不是(第一个列表)
(尽管我希望您确实知道这一点,并且输入错误)。第二个是(第一个mylist)
返回一个列表(因为您得到的是一个列表列表),但在将其传递给append之前,使用list
函数将其包装。因此,在您的示例中,您在第一次调用它时并没有将(列表1)
传递给append
,而是将它传递给(列表1))
。您只需从该表达式中删除列表
函数。如果您要求执行展平
过程,请尝试以下操作:
(define (flatten lst)
(cond ((empty? lst) null)
((not (list? lst)) (list lst))
(else (append (flatten (first lst))
(flatten (rest lst))))))
您可以测试它:
(flatten (list (list 1) (list 2) (list 3)))
> (1 2 3)
(flatten '(1 (2 (3)) (4)))
> (1 2 3 4)
“展平”是否也适用于树,或者是否有一个等价物?列表列表形成一棵树,所以可以这么说。为什么不给它一个测试呢?也许要指出一个明显的问题,
check expect
缺少一个接近的参数。