Как я могу рекурсивно напечатать элементы списка дважды? - PullRequest
2 голосов
/ 10 ноября 2010

Мне нужно написать рекурсивную функцию, которая печатает элементы списка дважды.Например, rdouble '(1 2 3) напечатает (1 1 2 2 3 3), а rdouble' (1 (2 3) 4) выведет (1 1 (2 2 3 3) 4 4).

Пока у меня есть:

(defun rdouble(struct)
 (cond
     ((atom struct) struct)
     (t (cons (rdouble (car struct)) (cons (car struct) 
              (rdouble (cdr struct))
        )))))

Это отлично работает для первого примера, но печатает

(1 1 (2 2 3 3) (2 3) 4 4)

для второго примера.Как мне продолжить распечатывать каждый элемент дважды, но не перепечатывать (2 3)?Что я делаю не так и как мне это исправить?

Ответы [ 2 ]

4 голосов
/ 10 ноября 2010

Выражение имеет три различных случая:

  1. атом -> вернуть его
  2. минусы с атомом в качестве CAR -> удвоить его
  3. aминусы с минусами как АВТОМОБИЛЬ -> идти вниз

Ваш код обрабатывает только два случая, где ваш второй случай смешивает 2 и 3.

0 голосов
/ 10 ноября 2010

причина, по которой вы испытываете проблемы, состоит в том, что при ((1 2) 3) ваш код возвращается в (1 2), который корректно становится (1 1 2 2) , а затем добавляет (1 2) (будучи car при первом вызове) после (1 1 2 2) подачи ((1 1 2 2) (1 2) ...)

Что было бы лучше, так это rdouble всегда возвращать список и append эти списки вместе вместо cons их

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...