2015-11-14 5 views
3

Я пытаюсь дублировать все записи в списке с помощью схемы:Схема дублирующих записей в списке

Это код, у меня есть:

(define double 
    (lambda (l) 
    (cond [(null? l) '()] 
      [(not (pair? l)) (list l l)] 
      [else (cons (double (car l)) (double (cdr l)))]))) 

Если мой вход (double '(a((b)(c d)(((e)))))), я получаю назад ((a a) (((b b)) ((c c) (d d)) ((((e e)))))).

Я хочу получить (a a((b b)(c c d d)(((e e))))).

Как мне это сделать? Если я заменил cons на append или list, это еще больше. Я могу использовать только команды, которые вы видите там, и такие команды, как let (и другие варианты let), map, atom, if и другие логические операторы.

+1

Примечание: Вы хотите, чтобы дублировать элементы в дереве (не список). – soegaard

+0

Что вы имеете в виду? –

+1

Список слов подразумевает один уровень. Дерево слов подразумевает, что вы хотите дублировать элементы на всех уровнях. – soegaard

ответ

1

Второе условие должно быть обработано несколько иначе, чтобы это работало, по сути, мы должны остановиться не тогда, когда мы достигнем атома, но когда мы достигнем списка, первым элементом которого является атом - таким образом, мы при необходимости может перестроить выходной список. Попробуйте это:

(define double 
    (lambda (l) 
    (cond [(null? l) '()] 
      [(not (pair? (car l))) 
      (cons (car l) 
       (cons (car l) 
         (double (cdr l))))] 
      [else (cons (double (car l)) 
         (double (cdr l)))]))) 

Сейчас он работает, как ожидалось:

(double '(a ((b) (c d) (((e)))))) 
=> '(a a ((b b) (c c d d) (((e e))))) 
+0

Большое спасибо! Ты лучший! –