2011-03-09 2 views
1

je dois faire quelque chose essentiellement comme ceci:Schéma: exécution séquentielle

(define test 
    (λ (ls1 ls2) 
    (cond 
     ((empty? ls2) null) 
     (else 
     (append ls1 (car ls2)) (test ls1 (cdr ls2))) (displayln ls1)))) 

La question est l'autre article et la fonction qui le suit. J'ai besoin des deux clauses de la clause else pour exécuter et j'ai besoin de la dernière fonction à exécuter, mais je ne peux pas obtenir la bonne syntaxe.

J'ai besoin (test '(1 2 3)' (4 5 6)) pour afficher '(1 2 3 4 5 6) et il doit utiliser l'appel récursif.

Un conseil est apprécié.

Merci.

+0

J'ai de la difficulté à comprendre ce que cette procédure devrait faire. Êtes-vous sûr que c'est supposé imprimer quelque chose, ou est-ce juste censé renvoyer 'ls1' et' ls2' ajoutés l'un à l'autre? – acfoltzer

Répondre

1

Si vous voulez désespérément de résoudre ce récursive, et vous ne se soucient pas de la valeur de retour, utilisez

(define (test l1 l2) 
    (if (null? l2) 
    (displayln l1) 
    (test (append l1 (list (car l2))) (cdr l2)))) 

(Ceci est très inefficace BTW: O (n × m) mémoire allocations.)

+0

Merci beaucoup. L'efficacité n'est pas un problème pour le moment. – Schemer

2

Il y a plusieurs problèmes ici. D'abord vous faites un append sur une liste et un atome (pas une liste) ... au moins si (car l2) n'est pas une liste. Deuxièmement, vous pensez probablement que (append l1 (list (car l2)) modifie l1. Mais ce n'est pas le cas. Le résultat est une nouvelle liste.

Pour séquencer votre opération, vous pouvez faire ce que les larsmans ont dit. Mais vous pouvez également écrire ce qui suit

(define (test l1 l2) 
    (if (null? l2) 
     (displayln l1) 
     (let ((l1-follow-by-car-l2 (append l1 (list (car l2))))) 
     (test l1-follow-by-car-l2 (cdr l2)))) 

Ceci a exactement le même comportement.