1

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

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

我到底想要什么:

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

2 回答 2

2

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

于 2012-02-21T19:21:28.593 回答
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)))
于 2012-02-22T01:20:04.860 回答