Petite récursion problematique en scheme

Fermé
marina - 2 mars 2008 à 20:24
 alios - 4 mars 2008 à 12:29
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

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
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
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
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
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
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