Petite récursion problematique en scheme

marina -  
 alios -
Bonjour, je dois écrire une fonction qui rend les n derniers réels d'une liste , le nième inclus , voici un exemple :

(derniers '( 4 5 6 8) 2) -> (6 8) , j'ai bien les 2 derniers inclus , voici mon code :

(define (derniers L n)
(if (pair? L)
(if (>= n 1)
(cons (cdr L)
(derniers (cdr L) (- n 1)))
(list))
(list)))

mais ça ne colle pas , quelqu'un aurait une idée pour m'aider ?

merci bien .

3 réponses

amigo
 
Bonjour,

Voici l'algo:

(fonction derniers Liste N)
Si (N < 0) retourner ()
Sinon Si (Longueur L) <= N retourner L
Sinon appeler (derniers (cdr L) N)

et voici le scheme

(define (derniers L n)
(if (< n 0) ()
(if (<= (length l) n) L
(derniers (cdr L) n))))

; test
(define L '( 4 5 6 8))
(derniers L 2) ; => (6 8)

Salut.
0
marina
 
merci beaucoup amigo , j'ai une petite précison à te demander si'l te plait , pour cette ligne :

(if (<= (length L) n)
L

je trouve pas ça joli ( mais je me trompe peut etre ) , d'écrire seulement L , ya pas moyen d'écrire autrement qu'on renvoit la liste considérée ?

merci
0
amigo
 
Effectivement c'est pas joli, sur mon interpreteur Scheme ça fonctionne, je ne sais pas si c'est vraiment correct

En fait je cherche à écrire : si longueur L <= n alors L=L
En lisp 'airais mis : (if (<= (length L) n) (setq L L) ; (setq L L) retourne L, mais ça n'existe pas en scheme.

Si tu sais comment le dire en scheme , ecrit le et dit moi aussi comment on fait, ma doc est en englais et je n'ai pas trouvé. Sinon j'ai essayé une autre syntaxe qui marche : la voici

(define (derniers L n)
    (if (< n 0) (list () )
     (if (<= (length l) n) (car(list L))
             (derniers (cdr L) n))))

(define L '( 4 5 6 8))
(derniers L 2)


Peux tu dire comment on fait une assignation du genre A=B ? Ce sera utile pour les prochains exos.
0
marina
 
merci amigo pour tes précisions , malheureusement moi je débute à peine et je ne te serai pas d'un grand secours , je suis désolée je ne sais pas pour l'assignation...
0
amigo
 
Bon ce n'est pas grave, je chercherai.
La première syntaxe que tu ne trouve pas jolie est correcte , il y a des exemples dans ma doc qui sont écrits comme ça.

Tu as un interpréteur scheme pour travailler? Est ce tu peux tester les exos? C'est pour vérifier si le tien réagit pareil que le mien.
0
alios
 
je me suis renseigné sur ton probleme amigo et.....
apparament y a pas d'autre solution que celle que ta écrit (C-A-D avec la fonction lenght)
C'est l'avis des expert auquel j'ai demandé.
En fait pourrait y avoir une autre solution mais j'suis pas sure à 100% et c'est pas recommandé (j'sais pas pourquoi
dailleurs mais je vais me renseigné et je te mets au courant)
0