преобразовать М мерный список в одном измерении - PullRequest
1 голос
/ 21 февраля 2012

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

Но есть алгоритм, для которого я не могу найти реализацию. Я говорю о преобразовании M-мерного списка в одно измерение. Я попытался определить это сам, но безуспешно.

Что именно я хочу:

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

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Я думаю, что вы хотите найти термин "Flatten". Самый простой способ написать это: если это не список, то вернуть список длиной один, содержащий его. Если это список, то метод apply добавляется к результату отображения рекурсивного вызова по его элементам.

1 голос
/ 22 февраля 2012

Есть несколько способов сгладить список. Во-первых, простое решение с использованием только простых процедур списка:

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