如何返回列表列表中的所有元素? (PLT计划)

时间:2011-10-29 04:23:21

标签: 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) (list 2) (list 3)))
              (list 1 2 3)

3 个答案:

答案 0 :(得分:2)

你实际上相当接近。以下是一些可能有用的问题:

listoutput的合同/签名是什么?

append的合同/签名是什么?

另外,我建议首先简单地构建您的示例,每个示例都基于之前的示例构建。例如,

(check-expect (listoutput empty)) ???)
(check-expect (listoutput (cons (list 1) empty)) ???)

如果第一次测试通过但第二次测试失败,那么在给定函数结构的情况下,这意味着问题在哪里?

答案 1 :(得分:0)

[(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))]))

该行有两个错误。最明显的是它应该是(first mylist)而不是(first list)(尽管我希望你实际上知道并错误地输入了它)。第二个是(first mylist)返回一个列表(因为你得到了一个列表列表),但是在将它传递给append之前你用list函数包装它。因此,在您的示例中,您第一次调用它时并未将(list 1)传递给append,而是(list (list 1))。您只需从该表达式中删除list函数。

答案 2 :(得分:0)

你要求flatten程序,试试这个:

(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)