List 在一维中转换M维列表

List 在一维中转换M维列表,list,lisp,scheme,flatten,bigloo,List,Lisp,Scheme,Flatten,Bigloo,我是scheme编程的新手,正在学习基本算法,比如如何定义映射、追加等 但有一种算法我找不到实现。我说的是将M维列表转换为一维。我试图自己定义它,但没有成功 我到底想要什么: '(a b c (d (e)) (g f h)) => '(a b c d e g f h) 我想你要搜索的术语是“扁平化”。编写它的最简单方法是:如果它不是一个列表,那么返回一个包含它的长度为1的列表。如果它是一个列表,则将append应用于将递归调用映射到其元素的结果。有几种方法可以展平列表。首先,一个仅使用基

我是scheme编程的新手,正在学习基本算法,比如如何定义映射、追加等

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

我到底想要什么:

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

我想你要搜索的术语是“扁平化”。编写它的最简单方法是:如果它不是一个列表,那么返回一个包含它的长度为1的列表。如果它是一个列表,则将append应用于将递归调用映射到其元素的结果。

有几种方法可以展平列表。首先,一个仅使用基本列表过程的简单解决方案:

(define (flatten lst)
  (cond ((null? lst)
         '())
        ((not (list? lst))
         (list lst))
        (else
         (append (flatten (car lst))
                 (flatten (cdr lst))))))
另一种解决方案使用
映射
高阶过程和
应用
(如John Clements所建议):

最后,正如评论中提到的,内置的
flatte
过程可以在一些方案实现中找到,比如Racket(我不知道它在bigloo中是否可用):

Flatte内置于Racket的标准库中:
(define (flatten lst)
  (if (not (list? lst))
      (list lst)
      (apply append (map flatten lst))))
(require racket/list)
(flatten '(a b c (d (e)) (g f h)))