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

MATLAB Discussion :

Fonction récursive : compter le nombre d'appels


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Par défaut Fonction récursive : compter le nombre d'appels
    Bonjour a tous :

    j'ai un petit soucis, à savoir je veux compter le nombre d'appels d'une fonction récursive dans une application déployée.
    pour l'instant dans mon script je me débrouille avec profile, mais celui-ci n'est pas supporté par la compilation, ce qui est logique me direz-vous

    Bon je peux pas montrer mon code, mais pour l'exemple prenons ceci qui se rapproche de ce que je fais : une fonction qui calcule le nombre de partitions d'un entier naturel en au plus q parties (pêchée sur l'ami wikipedia) : http://fr.wikipedia.org/wiki/Algorithme_r%C3%A9cursif.

    en matlab, ca donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function nb = d(p, q) 
             if p == 0 
                 nb = 1;
             elseif q == 0 
                 nb = 0;
             elseif q > p 
                 nb = d(p, p);
             else
                 nb = d(p-q, q) + d(p, q-1);
             end    
    end
    pour essayer de "compter" le nombre d'appels, j'ai essayé d'utiliser une variable globale et j'ai fait ça :

    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
    function [nb, n_tot] = d(p, q) 
    global n_iter
    if isempty(n_iter)
        n_iter = 0;
    end
    n_iter = n_iter+1;
             if p == 0 
                 nb = 1;
             elseif q == 0 
                 nb = 0;
             elseif q > p 
                 nb = d(p, p);
             else
                 nb = d(p-q, q) + d(p, q-1);
             end    
             n_tot = n_iter;
    end
    seulement, les variables globales c'est pas forcement ce que je préfère, en effet me connaissant je vais forcément me planter quelque part dans une initialisation ou un truc du genre.. et je me demandais si quelqu'un connaissait une alternative?

  2. #2
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Bonjour,

    Une variable persistante est plus adaptée. Elle est interne à la fonction et a la même persistance qu'une variable globale, mais c'est grosso modo la même chose.

    Dans tous les cas, les vrais problèmes de cette approche globale/persistant sont:
    1/ Il faut aussi prévoir un accès en lecture à la variable persistante (qui est interne à la fonction)
    2/ Si j’appelle deux fois de suite la fonction, le compteur va cumuler. Il faut prévoir une manière de réinitialiser le compteur, pour compter deux appels utilisateurs successif à la fonctions. (ou laisser l'utilisateur faire la différence avant/aprés)
    3/ Ce n'est pas thread-safe en cas d'accès concurrents.

    Quelques pistes pour contourner ce problème:
    * / La variable global ou persistante devient un dictionnaire : argument initiaux -> compteur. Il faut alors passer les arg initiaux en récursion, ou utiliser dbstack() pour savoir quel est l'appel externe. On peut adjoindre l'id du thread courant à la clef pour un comportement thread-safe.
    */ On part sur un vrai design objet de fonctions instanciées: créer des instances de fonctions callables (surchargeant subsref) pour lesquels des attributs jouent le rôle de compteur, qui deviennent donc locaux et indépendants d'une instance à l'autre, et facilement accessible. C'est sans doute l'approche la plus propre.

    EDIT: tu peux aussi passer une instance d'une handle class depuis l'appel principal vers les sous-appels.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2013
    Messages : 189
    Par défaut
    Yop, merci de la réponse! pour l'instant, je suis un peu dans le rush, alors je vais me contenter d'instancier ça en variable persistante, avec une remise a zero apres chaque appel.

    Normalement je n'ai qu'un seul thread donc je n'aurai a priori pas de problème d'exécution thread safe

    A terme j'essayerai de mettre en œuvre un design objet de fonction!

    J'aurai sans doute des questions dans quelques semaines

Discussions similaires

  1. fonction pour compter le nombre de personne dans une tranche d'age
    Par djo007 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/02/2012, 00h03
  2. Réponses: 7
    Dernier message: 19/09/2009, 00h05
  3. Réponses: 10
    Dernier message: 07/01/2009, 10h20
  4. Réponses: 3
    Dernier message: 08/09/2006, 12h35
  5. fonction pour compter le nombre de checkbox coché ?
    Par Death83 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/09/2005, 11h28

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