我是方案编程的新手,正在学习基本算法,比如如何定义映射、附加等等
但有一种算法我找不到实现。我讲的是将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)))