IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scheme Discussion :

Nombre d'occurences du maximum d'une liste


Sujet :

Scheme

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Nombre d'occurences du maximum d'une liste
    Bonjour tout le monde!alors voici l'énnoncé de mon exo:

    on me demande de créer une fonction qui étant donnée une liste non vide de nombre rend le couple formé du maximum de la liste et de son nombre d'occurences:

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (fonction (list 1 3 3 2))->( 3 2)
    (fonction (list 7))->( 7 1)
    alors j'ai écrire le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (define (fonction L)
      (if (pair? L)
          (if (pair? (cdr L))
              (let ((res (fonction (cdr L))))
                (if (> (car L) (car res))
                  (if (= (car L) (car couple))
                      (list (car L) (+ 1 (car couple)))
                      couple)))
              (list (car L) 1))
          (list 0 0)))
    quand j'essaye sa marche pour le cas de base mais pour le reste nada!Je vois vraiment pas ou est le probléme donc si quelqun pouvait m'aider ce serait sympa!Merci à tous et bonne soirée!

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je pense que tu dois envisager d'abord deux cas : soit la liste est vide soit elle ne l'est pas.
    Ensuite si la liste n'est pas vide, elle possède donc au moins 1 élément qui est le premier maximum que tu rencontres.
    Tu devrait donc utiliser une fonction secondaire qui parcourt la liste et étudie le premier élément en fonction du couple (max nb) qu'elle connait déjà.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je voudrais ajouter que le comportement correct si la liste est vide est probablement d'échouer violemment plutôt que de renvoyer '(0 0).
    Par ailleurs ta fonction bien que non idéale (la proposition de TrapD est terminalement récursive puisqu'il s'agit d'un fold_left) devrait fonctionner, le seul problème est que tu changes de nom pour ta variable (res devient couple) sans raison, par ailleurs tu utilises (car couple) au lieu de (cadr couple)...

    --
    Jedaï

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut re
    bonsoir,tout d'abord je tiens à vous remercier de m'avoir répondu!Concernant le code de la fonction en effet j'ai fait une faute de frappe j'ai mis couple au lieu de res!le truc en faite c'est que j'ai essayé de dérouler cette fonction mais j'arrive pas voir quand est on obtient le couple est ce a partir de res?si quelqun pouvait me dérouler cette fonction ne serait ce qu'avec un cas simple juste que pour que je comprenne ça m'aiderait à comprendre!Merci à tous et bonne soirée!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    Ci-dessous ton code corrigé et commenté.

    Il subsiste au moins deux soucis :
    - le renvoi de '(0 0) si la liste est vide (cf. ci-dessus) ;
    - la fonction ainsi définie n'est pas récursivement terminale.

    Nicolas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    (define (fonction L)
      (if (null? L) ; si L est une liste vide...
          '(0 0) ; ... on renvoie (0 0)
          ; à partir de cette ligne, on sait que L a au moins 1 élément
          (if (null? (cdr L)) ; si L ne contient qu'un élément...
              (list (car L) 1) ; ... on renvoie cet élément, avec 1 comme nombre d'occurence(s)
              ; à partir de cette ligne, on sait que L a au moins 2 éléments
              (let ((res (fonction (cdr L)))) ; res est donc le couple (maximum de cdrL, nb d'occurrences dans cdrL)
                (if (> (car L) (car res)) ; si (car L) est supérieur à (car res), ...
                    (list (car L) 1) ; ... c'est en fait lui, (car L), le maximum de L, et de nb d'occurrence(s) 1
                    (if (= (car L) (car res)) ; ... sinon, si (car L) est égal à égal à (car res)...
                        (list (car L) (+ 1 (cadr res))) ; ... (car res) est le bon maximum, il faut juste augmenter son nombre d'occurrences de 1 ...
                        res)))))) ; ... sinon on renvoie res, puisque carL est < que le maximum de cdr L
    
    (fonction '()) ; -> (0 0)
    (fonction '(7)) ; -> (7 1)
    (fonction (list 1 3 3 2)) ; -> (3 2)
    (fonction (list 1 2 4 3)) ; -> (4 1)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Une possible variante récursivement terminale...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    (define (fonction2-aux L maximum-courant nb-occurrences-courant)
      (if (null? L) 
          (list maximum-courant nb-occurrences-courant)
          (if (> (car L) maximum-courant)
              (fonction2-aux (cdr L) (car L) 1)
              (if (= (car L) maximum-courant)
                  (fonction2-aux (cdr L) maximum-courant (+ nb-occurrences-courant 1))
                  (fonction2-aux (cdr L) maximum-courant nb-occurrences-courant)))))
    (define (fonction2 L)
      (if (null? (cdr L)) ; L n'a qu'un élément
          (list (car L) 1)
          (fonction2-aux (cdr L) (car L) 1)))
    ; (fonction2 '()) ; -> ERREUR
    (fonction2 '(7)) ; -> (7 1)
    (fonction2 (list 5 6)) ; -> (6 1)
    (fonction2 (list 1 3 3 2)) ; -> (3 2)
    (fonction2 (list 1 2 4 3)) ; -> (4 1)
    (fonction2 (list 3 3 3 3)) ; -> (3 4)

  7. #7
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par sam_93
    si quelqun pouvait me dérouler cette fonction ne serait ce qu'avec un cas simple juste que pour que je comprenne ça m'aiderait à comprendre!
    L'intérêt du style déclaratif c'est que justement tu n'as pas besoin de dérouler une fonction pour la comprendre. Tu la comprends à l'aide d'un principe d'induction, par exemple ici:
    • quelle valeur est renvoyée pour une liste à 1 élément
    • sinon quelle valeur est renvoyée pour une liste à n > 1 éléments


    Ce sont les programmes impératifs qui doivent être déroulés pour constater que leur comportement est raisonnable.
    Dérouler un programme déclaratif n'aide pas à le comprendre, ça n'aide à comprendre que la machine impérative qui l'implémente.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

Discussions similaires

  1. Definir un nombre maximum dans une liste
    Par jjpopaul dans le forum Langage
    Réponses: 1
    Dernier message: 13/04/2010, 16h48
  2. Nombre d options a afficher dans une liste (select)
    Par wwluigi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 16/01/2007, 15h17
  3. [PL /SQL] - Maximum d'une liste
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 2
    Dernier message: 29/11/2006, 12h02
  4. Réponses: 2
    Dernier message: 29/03/2006, 18h47
  5. Maximum d'une liste
    Par deubal dans le forum Langage
    Réponses: 3
    Dernier message: 02/12/2005, 01h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo