在一个维度上变换M维列表

时间:2012-02-21 19:17:19

标签: list lisp scheme flatten bigloo

我是计划编程的新手,我正在学习基本算法,比如如何定义地图,追加等等。

但是有一种算法,我无法找到实现。我谈到将M维列表转换为一维。我试图自己定义它,但没有成功。

我究竟想要什么:

'(a b c (d (e)) (g f h)) => '(a b c d e g f h)

2 个答案:

答案 0 :(得分:2)

我认为您要搜索的术语是“Flatten”。编写它的最简单方法是:如果它不是列表,则返回包含它的长度为1的列表。如果它是一个列表,则将append添加到映射递归调用的结果上。

答案 1 :(得分:1)

有几种展平列表的方法。首先,只使用原始列表程序的直接解决方案:

(define (flatten lst)
  (cond ((null? lst)
         '())
        ((not (list? lst))
         (list lst))
        (else
         (append (flatten (car lst))
                 (flatten (cdr lst))))))

此其他解决方案使用map高阶程序和apply(由John Clements建议):

(define (flatten lst)
  (if (not (list? lst))
      (list lst)
      (apply append (map flatten lst))))

最后,正如评论中所提到的,在一些Scheme实现中找到的内置flatten过程就像Racket(我不知道它是否在bigloo中可用):

(require racket/list)
(flatten '(a b c (d (e)) (g f h)))