在一维中变换M维列表



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

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

我到底想要什么:

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

我认为您要搜索的术语是"Flatten"。最简单的编写方法是:如果它不是列表,则返回一个包含它的长度为1的列表。如果它是列表,则将append应用于对其元素进行递归调用的映射结果。

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

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

相关内容

  • 没有找到相关文章

最新更新