2016-03-03 2 views
1

Я пишу функцию дубликатора, используя ракетку. Функция дубликатора принимает вложенный список символов и чисел L и создает вложенный список символов и чисел путем «немедленного дублирования» каждого атома (символа или номера) на всех уровнях. Например: (duplicator '(a 1 b 2 c 3)) производит (aa 1 1 bb 2 2 cc 3 3), (дубликатор' ((a 1) b ((c)) 2) производит ((. аа 1 1) бб ((сс)) 2 2)Функция дубликатора ракеты

Вот моя функция:

(define (duplicator ls) 
    (if (null? ls) 
     '() 
     (cons (car ls) 
      (cons (car ls) 
        (duplicator (cdr ls)))))) 

у меня проблема является выводом (дубликаторе «((1) Ь ((с)) 2)) is '((a 1) (a 1) bb ((c)) ((c)) 2 2), чего я не хочу. Может ли кто-нибудь сказать мне, как правильно это сделать, пожалуйста ?

+0

Вам нужно обусловить если сам на текущий элемент списка или нет. Если это так, он не должен дублировать, но рекурсивно вызывает дублируемую функцию с внутренним списком в качестве аргумента. Только когда вы находитесь на самом низком уровне, должно произойти дублирование. Я не знаком с синтаксисом Racket, но я попытаюсь понять это. –

ответ

1

Вот решение:

(define (duplicator ls) 
    (cond ((null? ls) '()) 
     ((list? (car ls)) (cons (duplicator (car ls)) (duplicator (cdr ls)))) 
     (else (cons (car ls) (cons (car ls) (duplicator (cdr ls))))))) 

(duplicator '((a 1) b ((c)) 2)) ; produces ((a a 1 1) b b ((c c)) 2 2) 
0

Вот другое решение, которое использует процедуру foldr более высокого порядка

(define (duplicator xs) 
    (foldr (λ (x ys) 
      (if (list? x) 
       (cons (duplicator x) ys) 
       (cons x (cons x ys)))) 
     empty 
     xs)) 

(duplicator '((a 1) b ((c)) 2)) 

; => '((a a 1 1) b b ((c c)) 2 2) 
Смежные вопросы