2011-11-05 2 views
2

La fonction manageFirstList doit recopier récursivement un élément à la fois vers la liste globale x.Variables globales et fonctions de liste

(define test1DataA '(("a" "a") ("b" "b") ("c" "c") ("d" "d") ("e" "ok"))) 
(define test1DataB '(("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("ok" "Ir OK!"))) 

(define x '()) 

(define manageFirstList 
    (lambda (a b) 
    ((cond ((not (null? b)) 
      ((append x (car a)) 
      (manageFirstList (cdr a) b))))))) 

(define ff (lambda (a b) (manageFirstList a b))) 

(ff test1DataA test1DataB) 

Mais il provoque une erreur:

car: expects argument of type <pair>; given '() 

Les questions sont:

  1. Comment puis-je mettre à jour la valeur globale `x '?
  2. Comment concaténer les listes de la bonne manière?
  3. Puis-je appeler plus de 1 fonction (ou est-il une solution de contournement) comme ceci:

    ((append x (car a)) 
    (manageFirstList (cdr a) b)) 
    

EDIT: Ce que je suis en train de faire est de créer une liste avec la première valeur de chaque élément de liste test1DataA et deuxième valeur de chaque élément de liste test1DataB, où valeur seconde de l'élément de liste test1DataA est identique à la première valeur de test1DataB de son élément de liste.

Répondre

2

A propos de vos questions:

  1. Bien que vous pouvez mettre à jour une variable globale à partir d'une fonction à l'aide (set! x <value>), vous devriez vraiment pas, ce n'est pas la meilleure façon de programmer en utilisant le schéma; à la place, vous devez renvoyer une nouvelle liste de votre procédure et, si nécessaire, affecter la valeur renvoyée à x par la suite
  2. Que voulez-vous dire par "la bonne façon"? la procédure append concatène deux listes, c'est la bonne façon de le faire, si vous me demandez :). Vous appelez simplement comme ceci: (append a b), où les deux a et bdoivent être listes
  3. Le code est erroné, parce que vous êtes autour de l'appel à append entre une paire de parenthèses, le schéma va essayer d'appliquer la valeur retourné par (append ...) comme s'il s'agissait d'une procédure avec les arguments (manageFirstList (cdr a) b), et évidemment il va échouer, puisque append retourne une liste, pas une procédure. Et peut-être devriez-vous expliquer exactement ce que vous voulez dire par «puis-je appeler plus d'une fonction» - bien sûr que vous le pouvez, mais qu'avez-vous l'intention de faire? combiner les résultats des deux appels? traiter les résultats indépendamment?

Quoi qu'il en soit, la procédure ci-dessus va échouer pour plusieurs raisons - vous ne pensez pas les cas où les listes sont nuls, vous êtes seulement récurrent sur l'une des listes, etc.

Enfin , vous devriez préciser quel est le résultat attendu de la procédure, après l'avoir appelé avec (ff test1DataA test1DataB), quelle est la valeur que vous voulez voir dans x? écrivez-le dans le cadre de votre question, car le texte "copier récursivement un élément à la fois sur la liste globale x" n'est pas assez clair.

Edit:

Ok, voici mon coup à répondre à votre question, je l'espère, je vous ai bien compris.Notez que j'utilise la procédure assoc pour la recherche chaque seconde valeur dans la première liste, dans la deuxième liste, en interprétant donc la deuxième liste comme une liste d'association:

(define (manageFirstList lst1 lst2) 
    (cond ((null? lst1) '()) 
     (else (cons (list (caar lst1) (cadr (assoc (cadar lst1) lst2))) 
        (manageFirstList (cdr lst1) lst2))))) 

Maintenant, si vous devez absolument changer la valeur de la variable globale x, il suffit de faire quelque chose comme ceci:

(define x '()) 
(set! x (manageFirstList test1DataA test1DataB)) 

Remarquez comment j'évitais complètement la nécessité de modifier x intérieur de la procédure, car en général ce n'est pas la façon dont le schéma pour résoudre les problèmes. À la fin, la valeur dans x est:

(("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("e" "Ir OK!")) 
+0

Merci pour l'explication. Ce que j'essaie de faire est de créer une liste avec la première valeur de chaque élément de liste test1DataA et la deuxième valeur de chaque élément de liste test1DataB, où la deuxième valeur de l'élément de liste test1DataA est identique à la première valeur test1DataB de son élément list. C'est ce que la valeur X devrait contenir. – Trac3

+0

Il serait beaucoup plus clair si vous écrivez simplement la liste résultante comme vous le voulez, au lieu de l'expliquer en mots. Quoi qu'il en soit, je vais essayer. –

+0

Merci :) Vos réponses m'ont vraiment aidé à mieux comprendre SCHEME. – Trac3