2009-10-03 7 views
3

J'ai écouté le programming paradigm lecture series de Stanford, mais je suis confus par le code suivant (de la conférence 20). Quelqu'un pourrait-il expliquer, ligne par ligne, ce que cela fait?Quelqu'un peut-il expliquer le code de schéma suivant?

Merci.

(define (flatten sequence) 
    (cond ((null? sequence) '()) 
     ((list? (car sequence)) (append (flatten (car sequence)) 
             (flatten (cdr sequence)))) 
     (else (cons (car sequence) 
        (flatten (cdr sequence)))))) 
+0

me manque Scheme de mes jours de collège – Martin

Répondre

7
# define a procedure 'flatten' that takes a list 'sequence' 
(define (flatten sequence) 
    # if the 'sequence' is empty, return an empty list 
    (cond ((null? sequence) (list)) 
     # if the first element of 'sequence' is itself a list, return a new list 
     # made by appending the flattened first element of 'sequence' with the 
     # flattened rest of the 'sequence' 
     ((list? (car sequence)) 
     (append (flatten (car sequence)) 
       (flatten (cdr sequence)))) 
     # if the first element of 'sequence' is not a list, return a new list 
     # made by cons-ing that element with the flattened rest of the 'sequence' 
     (else 
     (cons (car sequence) 
       (flatten (cdr sequence)))))) 

I assez préimprimés il (inséré quelques nouvelles lignes et en retrait le code pour montrer sa structure) et également remplacé '() avec (list) (qui a la même valeur) juste pour empêcher le code d'être mis en évidence de manière incorrecte .

+1 ce qui est contre? J'apprécierais que vous expliquiez d'autres mots-clés. merci

Quand je dis par contre je me réfère simplement à la procédure cons. Quand vous voyez (cons <expression> <list>)<expression> est une expression Scheme ou de la valeur et <list> est une expression Scheme qui évalue à une liste, cons renverra le <list> avec la valeur de la <expression> clouée sur le devant. Par exemple, (cons 1 (list 2 3 4)) renvoie la liste (list 1 2 3 4). En fait, (list 1 2 3 4) dans Scheme est juste un court chemin d'écriture . Les deux autres mots que vous pourriez rencontrer sont car et cdr. Vous pouvez penser (car <list>) comme signifiant le premier élément ou tête du <list> et (cdr <list>) comme signifiant le reste des éléments ou queue du <list>. Par exemple, (car (list 1 2 3 4)) renvoie la valeur 1 et (cdr (list 1 2 3 4)) renvoie la liste (list 2 3 4).

Si vous avez besoin d'aide avec d'autres mots clés, faites le moi savoir.

+1

oh, les commentaires de régime me souvenais juste commencer par des points-virgules. mais quand je change les octothorpes en points-virgules, la surbrillance devient foirée ... –

+0

+1 ce qui est contre? J'apprécierais que vous expliquiez d'autres mots-clés.merci – vehomzzz

+0

merci @Jeremy Ruten - vous semblez connaître votre chemin autour du schéma! – vehomzzz

1
  1. définir la fonction d'aplatir une séquence

  2. Pour la séquence vide, revenir à vide

  3. si la tête (voiture) de la liste est un retour le résultat séquence de aplatissement il a ajouté à l' aplatissement de la queue (cdr)

  4. sinon ajouter la tête à l'aplatissement de la queue

Questions connexes