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
Configuration: Windows XP
Firefox 2.0.0.12

5 réponses

  1. 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
    1. 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
  2. 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
    1. 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
  3. amigo
     
    OK, je reviens dans quelques minutes...
    0
  4. 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
    1. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
    1. 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