Преобразовать М мерный список в одном измерении
Я новичок в программировании схем и изучаю базовые алгоритмы, такие как определение карты, добавление и так далее.
Но есть алгоритм, для которого я не могу найти реализацию. Я говорю о преобразовании M-мерного списка в одно измерение. Я пытался определить это сам, но безуспешно.
Что именно я хочу:
'(a b c (d (e)) (g f h)) => '(a b c d e g f h)
2 ответа
Есть несколько способов сгладить список. Во-первых, простое решение, использующее только процедуры примитивного списка:
(define (flatten lst)
(cond ((null? lst)
'())
((not (list? lst))
(list lst))
(else
(append (flatten (car lst))
(flatten (cdr lst))))))
Это другое решение использует map
процедура высшего порядка и apply
(как предложено Джоном Клементсом):
(define (flatten lst)
(if (not (list? lst))
(list lst)
(apply append (map flatten lst))))
И, наконец, как уже упоминалось в комментариях, встроенный flatten
процедура, найденная в некоторых реализациях Scheme, таких как Racket (я не знаю, доступна ли она в bigloo):
(require racket/list)
(flatten '(a b c (d (e)) (g f h)))
Я думаю, что термин, который вы хотите найти, это "Flatten". Самый простой способ написать это: если это не список, то вернуть список длиной один, содержащий его. Если это список, то метод apply добавляется к результату отображения рекурсивного вызова по его элементам.