2010-11-09 2 views
2

J'ai besoin d'écrire une fonction récursive qui imprime deux fois les éléments d'une liste. Par exemple, rdouble '(1 2 3) imprimerait (1 1 2 2 3 3) et rdouble' (1 (2 3) 4) imprimerait (1 1 (2 2 3 3) 4 4).Comment puis-je imprimer deux fois les éléments d'une liste de manière récursive?

Jusqu'à présent, j'ai:

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

Cela fonctionne très bien pour le premier exemple, mais imprime

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

pour le deuxième exemple. Comment puis-je continuer à imprimer deux fois chaque élément sans les réimprimer (2 3)? Qu'est-ce que je fais de mal et comment puis-je le réparer?

+1

Quand vous dites, « print », voulez-vous dire « retour »? Et si c'est devoirs, vous devriez ajouter la balise "devoirs". –

+0

Oui, je veux dire retour ... désolé pour le tag, c'est ma première fois sur le forum ... –

+0

Pas de problème. Bienvenue dans le débordement de la pile! –

Répondre

0

la raison pour laquelle il est à l'origine des problèmes que vous rencontrez est que donné ((1 2) 3) votre code récursif dans (1 2), qui devient correctement (1 1 2 2)et ajoute ensuite (1 2) (étant le car dans le premier appel) après la (1 1 2 2) donnant ((1 1 2 2) (1 2) ...)

ce qui serait le mieux est de faire rdoubletoujours retourner une liste, et append ces listes ensemble au lieu de les cons ing

4

L'expression a trois cas:

  1. un atome -> retourner
  2. un contre avec un atome comme la RCA -> doubler
  3. un contre avec un contre que la voiture -> promenade vers le bas

gère votre code deux cas, lorsque votre deuxième cas se mélange 2 et 3.

+0

bonne façon de l'expliquer – tobyodavies

Questions connexes