2012-11-06 1 views
2

Probablement une question triviale pour la plupart des schémas les plus avancés ici, mais en tant que nouveau venu, j'ai trouvé que c'était un problème.Liste des schémas toujours dans l'ordre inverse

J'ai besoin d'un moyen de construire une nouvelle liste dans le même ordre qu'au moment où elle est arrivée. Par exemple, disons que nous avons une liste '(1 2 0 3 4 0 0 5). Mais en parcourant la liste et en renvoyant le cdr, le premier argument finit par construire la nouvelle liste en arrière.

Voici un exemple dans le code:

Je transmets une « ancienne liste » qui a besoin de travail et sur une liste vide comme « nouvelle liste » à former et retourné.

noter que la prise 0s out est juste ici comme « une condition » que la nouvelle liste doit rencontrer

(define (form-new-list old-list new-list) 
    (cond ((null? old-list) new-list) 
      (else 
      (if (eq? (car old-list) 0) (form-new-list (cdr old-list) new-list) 
       (form-new-list (cdr old-list) (cons (car old-list) new-list)))))) 

    ;test 
    (form-new-list '(1 2 0 3 4 0 0 5) '()) ; gives (5 4 3 2 1) 
    ;but want (1 2 3 4 5) 

JE NE veux juste inverser la liste qui est renvoyée par une procédure inverse, mais plutôt, voulez que la nouvelle liste soit mise dans l'ordre correct en premier lieu.

Existe-t-il une sorte de "truc", comme faire un appel récursif ailleurs?

Tout conseil est grandement apprécié.

Répondre

5

Vous recherchez la manière naturelle de parcourir une liste en utilisant la récursivité. Utilisez cette procédure comme un modèle pour votre solution - il copie simplement une liste exactement comme il est reçu:

(define (copy lst) 
    (if (null? lst) 
     '() 
     (cons (car lst) 
      (copy (cdr lst))))) 

Notez les points suivants:

  • La récursion se termine lorsque la liste d'entrée est nulle, et étant donné que nous construisons une nouvelle liste, la valeur correcte à renvoyer est la liste nulle
  • Nous sommes intéressés par la construction d'une nouvelle liste, nous faisons cela par cons en ajoutant un nouvel élément pour la liste de sortie, qui dans ce cas arrive à être le premier élément de la liste d'entrée (sa car partie)
  • Enfin, les avancements récursives en invoquant la procédure avec le reste de la liste d'entrée (sa cdr partie)

Comme d'habitude, je finis mes réponses apprendre aux gens comment penser récursive en recommandant de prendre un coup d'oeil soit The Little Schemer ou How to Design Programs, les deux livres vous apprendront comment grok processus récursifs en général, en utilisant Scheme.

+1

Merci Oscar. Je me suis dit qu'il me manquait là où vous faites la récursion là-bas; Consing la voiture à l'appel de procédure du cdr. Merci pour les conseils supplémentaires aussi. J'apprends avec le livre Structure et Interprétation des Programmes Informatiques pour l'instant, mais je vais garder cela à l'esprit. Cette question en particulier était celle que je voulais vraiment aborder. Habituellement, j'ai une méthode "inverse" gérer cela, mais c'est beaucoup mieux. Merci encore. – Matt

+1

De rien! SICP est un livre magnifique, je le recommande absolument, mais il peut être un peu difficile pour les débutants. –