Преобразовать М мерный список в одном измерении

Я новичок в программировании схем и изучаю базовые алгоритмы, такие как определение карты, добавление и так далее.

Но есть алгоритм, для которого я не могу найти реализацию. Я говорю о преобразовании 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 добавляется к результату отображения рекурсивного вызова по его элементам.

Другие вопросы по тегам