【发布时间】:2020-03-29 07:14:33
【问题描述】:
有什么功能可以改造
'((0 0 0) (4 0 0) (2 7 0)) 变成'(0 0 0 4 0 0 2 7 0)
【问题讨论】:
标签: list functional-programming scheme racket
有什么功能可以改造
'((0 0 0) (4 0 0) (2 7 0)) 变成'(0 0 0 4 0 0 2 7 0)
【问题讨论】:
标签: list functional-programming scheme racket
您要查找的操作称为flatten,它将展平所有子列表,无论它们的嵌套级别如何:
(flatten '((0 0 0) (4 0 0) (2 7 0)))
如果您的解释器不支持它,通常的实现方式(对于一层嵌套)是:
(apply append '((0 0 0) (4 0 0) (2 7 0)))
或者像这样,对于任意嵌套的列表(这就是内置的flatten 的工作方式):
(define (flatten lst)
(cond ((null? lst) '())
((pair? lst)
(append (flatten (car lst)) (flatten (cdr lst))))
(else (list lst))))
无论如何,它按预期工作:
'(0 0 0 4 0 0 2 7 0)
【讨论】:
你是对的,我必须实现它。这个适用于示例
(define (extract lista)
(if (equal? lista empty) '() (append (car lista) (extract(cdrlista)))))
【讨论】:
标准方案(n 的某些定义为 RnRS)不提供这样的功能,但您想要做的通常称为flatten,并且在许多方案库中都可用。如果这是家庭作业,我不会提供代码,但这里有一个框架可以帮助您入门:
(define (flatten xs)
(cond ((null? xs) ...)
((pair? xs)
(append (flatten ...)
(flatten ...)))
(else ...)))
【讨论】: