2010-02-17 12 views

Répondre

5

trouver la dernière d'une liste:

(define (last l) 
    (cond ((null? (cdr l)) (car l)) 
      (else (last (cdr l))))) 

carte d'utilisation de la carte dernière à une liste:

(map last '((a b) (c d) (e f))) 
==> (b d f) 

donc une nouvelle fonction:

(define (last-list l) 
    (map last l) 
) 

(last-list '((a b) (c d) (e f))) 
==> (b d f) 
+0

Cela retournera le dernier élément de chaque sous-liste ... pas ce qu'il demande, du mieux que je peux dire. Oui? –

+0

C'est ce qu'il demande à Steven, regardez attentivement la question originale (pas le code.) – McPherrinM

3

Le code » ve écrit - pour prendre le dernier élément d'une liste - est correctement renvoyant le dernier élément de la liste . Vous avez une liste de listes. Il y a une liste externe

(x y z) 

x = (a b) 
y = (c d) 
z = (e f) 

Alors vous obtenez le dernier élément de la liste, z, qui est (ef)

Est-ce que vous voulez que votre dernière fonction faire quelque chose de différent? Si vous voulez renvoyer le dernier élément de la dernière liste imbriquée, vous devez modifier votre cas de base. En ce moment vous retournez la voiture. Au lieu de cela, vous voulez vérifier si la voiture est une liste et ensuite appeler votre fonction imbriquée-dernière sur cela.

Avez-vous du sens?

1

Votre dernière fonction est bonne, mais vous devez penser à ce que vous voulez en faire maintenant.

Vous avez une liste de listes, et vous voulez prendre le dernier de tous ceux-là.

Alors récursif votre liste de l'appliquer à chaque fois:

(define (answer lst) 
    (cond ((null? (cdr l)) null) 
     (else (cons (last (car l)) (answer (cdr lst)))) 
1

Encore une autre possibilité:

(define (last thelist) 
    (if 
     (null? (cdr thelist)) (car thelist) 
     (last (cdr thelist)))) 

(define (all-last lists) (map last lists)) 

Edit: juste vu que vous ne connaissez pas map, et que vous voulez une solution sans elle :

(define (all-last lists) 
    (if 
     (null? lists) `() 
     (cons (last (car lists)) (all-last (cdr lists))))) 

En ce qui concerne l'obtention d'une liste vide, je suppose que vous essayez d'utiliser ce front de type carte avec votre définition originale de last, alors qu'il est prévu de travailler avec la définition de last j'ai donné ci-dessus.Essayez les définitions suivantes:

(define (last thelist) (if 
       (null? (cdr thelist)) (car thelist) 
       (last (cdr thelist)))) 

(define (all-last lists) (if 
         (null? lists) `() 
         (cons (last (car lists)) (all-last (cdr lists))))) 

et l'exécution d'un test rapide:

(tout dernier `((ab) (cd) (ef)))

Le résultat devrait être:

(BDF)

4

ne peut pas être le plus efficace, mais certainement l'un des plus simples:

(define (last lst) 
    (car (reverse lst))) 

Exemples:

(last '(1 2 3 4)) => 4  
(last '((a b) (b c) (d e))) => (d e) 
0
(define last 
    (lambda (ls) 
    (list-ref ls (- (length ls) 1)))) 
0

J'aime des procédures courtes, douces, rapides, récursif-queue.

Nommé let est mon ami.

Cela résout le problème d'origine et renvoie #f si la liste n'a pas de dernier élément.

(define (dernière L) (soit f ((dernière #f) (LL)) (si (vide? L) dernier (f (voiture L) (L cdr)))))

0

Le meilleur moyen d'obtenir ce que vous voulez:

(define (last lst) 
    (cond [(empty? lst) empty] 
     [(empty? (rest lst)) (first lst)] 
     [else (last (rest lst))])) 
Questions connexes