2012-02-21 2 views
1

Je suis nouveau dans la programmation de schéma et j'apprends des algorithmes de base, comme la façon de définir la carte, append et ainsi de suite.transformer la liste dimensionnelle M dans une dimension

Mais il existe un algorithme pour lequel je ne trouve pas d'implémentation. Je parle de la transformation d'une liste en dimension M en une seule dimension. J'ai essayé de le définir par moi-même, mais sans succès.

Qu'est-ce que je veux exactement:

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

Répondre

1

Il y a plusieurs façons pour d'aplatir une liste. Tout d'abord, une solution simple en utilisant uniquement les procédures de la liste primitive:

(define (flatten lst) 
    (cond ((null? lst) 
     '()) 
     ((not (list? lst)) 
     (list lst)) 
     (else 
     (append (flatten (car lst)) 
       (flatten (cdr lst)))))) 

Cette autre solution utilise la procédure d'ordre supérieur map et apply (comme suggéré par John Clements):

(define (flatten lst) 
    (if (not (list? lst)) 
     (list lst) 
     (apply append (map flatten lst)))) 

Et enfin, comme cela a été mentionné dans les commentaires, la procédure intégrée flatten trouvé dans certaines implémentations Scheme comme Racket (je ne sais pas si elle est disponible dans bigloo):

(require racket/list) 
(flatten '(a b c (d (e)) (g f h))) 
+1

cela fonctionne pour moi. Merci beaucoup! –

2

Je pense que le terme que vous voulez rechercher est « Aplatir ». La manière la plus simple de l'écrire est la suivante: si ce n'est pas une liste, renvoyez une liste de longueur la contenant. S'il s'agit d'une liste, appliquez append au résultat de mappage d'un appel récursif sur ses éléments.

+1

** aplatissement ** est intégré à la bibliothèque standard de Racket: http://docs.racket-lang.org/reference/pairs.html#(def._((lib._racket/list..rkt)._flatten)) – dyoo

Questions connexes