Petit semi predicat en scheme

marina -  
 marina -
Bonjour, je dois écrire un semi predicat en scheme qui prend une liste en parametre et qui renvoie la valeur maximum d'une liste , exemple :

(fonction '(2 5 3) -> (5)

Voici un petit code que j'ai écrit :

(define (max L)
(if (pair? L)
(if (> (car L) (cdr L))
(car L)
(max (cdr L)))
0)
)

mais il ne marche pas , quelqu'un pourrait il m'aider pour cet exercice ?

merci bcp

5 réponses

amigo
 
Bonjour,

pour ton exo MAX

en français

fonction (max L)
si L n'est pas une liste retourner 0

sinon si longueur de L =1 alors c'est la maxi : retourner element 1 de L

sinon si element 1 de L > element 2 de L alors constuire une nouvelle liste L
avec element 1 de L et elements 3 jusqu'au dernier de L; appeler (max L) ;recursivité

sinon L=nouvelle liste avec 2e element jusqu'au dernier de L ; appeler (max L); recursivité

fin fonction

En Algo:
Fonction max( L)
SI L n'est pas liste retourne(0)
  SINON SI Longueur(L) = 1 ALORS retourne(1er elem);(car L)
    SINON SI (1er elem L) >(2eme elem L) ALORS (max (L=nouvelle liste((1er elem L) (3e elem ->dernier elem L)))
       SINON (max (L=2e elem ->dernier elem L))

Fin Fonction


En scheme:
(define (max L)
(if (pair? L)
    (if (= (length L) 1) (car L)
       (if (> (car L) (car(cdr L)))
          (max (cons (car L) (cdr (cdr L))))
          (max (cdr L)))
     )
0)
) 

;test
(define  A '(10 2 13 3 9)); -> (13) 
(max A)

(define  B '(10 2 5 3 9)); -> (10) 
(max B)

(define C 10)
(max C); -> 0
0
marina
 
merci amigo j'ai très bien compris mais ce n'est pas un semi prédicat que tu as écrit mais une fonction , en fait l'exo est un peu plus complexe , si j'ai :

(max '(2 6 8)) , ça doit me rendre '(8 2) , où 2 est l'occurence du terme dans la liste , tu saurais comment ajouter l'occurence par hasard ?

merci bien .
0
amigo
 
Excuses-moi mais je ne comprends pas.

je dois écrire un semi predicat en scheme qui prend une liste en parametre et qui renvoie la valeur maximum d'une liste , exemple :
(fonction '(2 5 3) -> (5)
...c'est clair

(max '(2 6 8)) , ça doit me rendre '(8 2) , où 2 est l'occurence du terme dans la liste ...c'est pas clair

Reformule ton énoncé s'il te plait.
0
marina
 
ok je vais reformuler : écrire un semi predicat qui renvoie la valeur maxium d'une liste et son indice si la liste est non vide et renvoie faux sinon . le 1er élément de la liste a pour indice 0 .
0
amigo
 
OK, je reviens dans quelques minutes...
0
amigo
 
Apres quelques longes minutes voila le resultat, je sais pas si c'est vraiment ce que tu cherches mais ça marches
les variables i et j sont utilisées comme index.

(define i 0) ; index de position du max
(define j 0) ; conteur d'itération

(define (max L)
(set! j (+ 1 j))
  (if (pair? L)
    (if (= (length L) 1) (list (car L) i)
       (if (> (car L) (car(cdr L)))
           (max (cons (car L) (cdr (cdr L))))
           (begin (set! i j)(max (cdr L))))
     )
  0)
) 
;test
(set! i 0)
(set! j 0)
(define  A '(10 2 13 3 9)); -> (13 2) 
(max A)
(set! i 0)
(set! j 0)
(define  B '(10 2 5 3 9)); -> (10 0) 
(max B)
(set! i 0)
(set! j 0)
(define C 10)
(max C); -> 0
0
marina
 
merci amigo t'en as fait plus que tu le devais , merci bcp , a réponse est hors programme mais j'ai compris quand meme le 1er message , ça m'ira très bien .

quel niveau de prog tu as ?

PS : j'ai poste un autre message sur la fonction inverse , si tu as 5min pour jeter un oeil ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
amigo
 
petite rectif il faut renvoyer FAUX pour une liste vide
(define i 0) ; index de position du max
(define j 0) ; conteur d'itération

(define (max L)
(set! j (+ 1 j))
  (if (pair? L)
    (if (= (length L) 1) (list (car L) i)
       (if (> (car L) (car(cdr L)))
           (max (cons (car L) (cdr (cdr L))))
           (begin (set! i j)(max (cdr L))))
     )
  #f)
) 
;test
(set! i 0)
(set! j 0)
(define  A '(10 2 13 3 9)); -> (13 2) 
(max A)
(set! i 0)
(set! j 0)
(define  B '(10 2 5 3 9)); -> (10 0) 
(max B)
(set! i 0)
(set! j 0)
(define C '())
(max C); -> #f ;liste vide
0
marina
 
merci amigo t'en as fait plus que tu le devais , merci bcp , a réponse est hors programme mais j'ai compris quand meme le 1er message , ça m'ira très bien .

quel niveau de prog tu as ?

PS : j'ai poste un autre message sur la fonction inverse , si tu as 5min pour jeter un oeil ...
0