Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
965 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Recurrence et Variable identique / Règles d'écritures

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Recurrence et Variable identique / Règles d'écritures

n°1812922
NathanGe
Posté le 17-11-2008 à 11:01:15  profilanswer
 

Bonjour,
 
Je dois programmer une méthode d'une classe qui utilise la récurrence mais dont l'appel utilise également une variable qui ne sera pas modifiée d'appel en appel. Je voudrais savoir quelle est la règle d'écriture la plus propre à adopter.
 
Plus simplement, par exemple, si je veux calculer la fonction qui a " n " associe " n ! + m ", dans une classe MonMath, je dois écrire :

Code :
  1. MonMath::mafactorielle(int n,int m)
  2. {
  3. if (n==0)
  4.       return (1+ m);
  5. else
  6.       return (mafactorielle(n-1,m);
  7. }


Ce qui me gène, dans mon cas qui est plus complexe que celui présenté ici, c'est que la variable " m " peut être grande en taille mémoire et que son utilisation systématique peut être lourde à gérer. Je voudrais donc savoir comment se ramener à une écriture plus propre en terme de récurrence, du type :

Code :
  1. MonMath::mafactorielle(int n)
  2. {
  3. if (n==0)
  4.       return (1 + m);
  5. else
  6.       return (mafactorielle(n-1);
  7. }


Est-ce que, dans cette situation, il vaut mieux définr la variable m comme une variable globale ou comme une variable statique. Dans les deux, cas, elle restera visible dans la méthode, avec une valeur qui lui aura été affectée avant le premier appel à mafactorielle. Ce qui me gêne dans la première écriture, c'est le transport, dans l'ensemble des appels sucessifs d'une variable m qui ne se révèle utilse que à la fin, lors de l'ultime appel.
 
Est-ce que vous pourriez ainsi me conseiller une règle d'écriture propre ?
 
Merci d'avance de votre aide,
 
NathanGe
 
 

mood
Publicité
Posté le 17-11-2008 à 11:01:15  profilanswer
 

n°1812959
Taz
bisounours-codeur
Posté le 17-11-2008 à 12:11:49  profilanswer
 

Si ton objet à empiler est gros:
- si c'est de l'allocation sur la pile, si c'est de la récursivité terminale ça ira tout seul
- si c'est de l'allocation dynamique ça va tout de suite moins bien marcher puisqu'en fin d'appel récursif, il faudra revenir dans le contexte appelant pour détruire les resources (explicitement ou un implicitement). Donc dans ce cas là, soit tu passes un pointeur vers le nouvel objet dans l'appel récursif, et c'est l'appelé qui le détruit lui même, soit tu passes en itératif. Si ton objet est modifié à chaque appel (-1 ou +1 par exemple), tu peux aussi te contenter de le passer par & (pas const), ça revient au cas du pointeur - la désallocation. Gare au effet de bords

n°1812961
Taz
bisounours-codeur
Posté le 17-11-2008 à 12:15:48  profilanswer
 

Genre

Code :
  1. #include <vector>
  2. void recurse_helper(std::vector<int>& v, unsigned& n)
  3. {
  4.   if (n != 0) {
  5.     v.push_back(n);
  6.     n--;
  7.     recurse_helper(v, n);
  8.   }
  9. }
  10. void recurse(std::vector<int> v, unsigned n)
  11. {
  12.   recurse_helper(v, n);
  13. }


 
Tu travailles avec une copie de ton paramètre initial (que ce soit un vecteur ou un entier). Mais ça tourne vite à la récursivité battarde. A toi de voir.

n°1813001
Joel F
Real men use unique_ptr
Posté le 17-11-2008 à 14:35:00  profilanswer
 

recursivitéG [:sadnoir]

 

la récursivité c'ets bien mais bon, faut rester pragmatique sur la faisabilité de la chose sur de vrais machine.


Message édité par Joel F le 17-11-2008 à 14:35:39
n°1813020
Taz
bisounours-codeur
Posté le 17-11-2008 à 15:07:05  profilanswer
 

en fait il te faut faire la même technique qu'en fonctionnel pour rendre une fonction terminale: un paramètre modifié et modifiable que tu transportes entre appel.

n°1813030
Joel F
Real men use unique_ptr
Posté le 17-11-2008 à 15:29:59  profilanswer
 

En fonctionnel le pb se pose différemment, tu passe tout en valeur anyway

n°1813044
Taz
bisounours-codeur
Posté le 17-11-2008 à 16:13:29  profilanswer
 

Bah tu passes ton pointeur par valeur et pas par référence et voilà :)

n°1813046
Joel F
Real men use unique_ptr
Posté le 17-11-2008 à 16:16:23  profilanswer
 

tu conviendras que la notion de pointeur en langage fonctionnel reste un truc à spécifier proprement ;)

n°1813106
NathanGe
Posté le 17-11-2008 à 17:54:00  profilanswer
 

Il s'agit, dans mon cas plus complexes que celui décrit, de paramètres permettant de communiquer avec Access pour mes bases de données.
Ces paramètres (char* avec adresse de fichier ....) sont actuellement transmis à chaque appel de la méthode par récurrence. Cependant, il ne sont utilisés que lors du dernier appel, lorsque n est nul.  
 
Dans une première version du code, j'avais mis les objets en static dans la méthode, en considérant que cela était plus propre pour gérer la récurrence, car cela évitait de rappeler une méthode qui ne l'utilisait que dans un cas précis, où n était nul.
 
D'après la réponse de Taz, je vais sans doute mettre ces objets dans les arguments de la méthode finalement.
 

n°1813138
Taz
bisounours-codeur
Posté le 17-11-2008 à 20:08:50  profilanswer
 

euh ça coute rien ton problèmes, c'est juste une poignée de pointeurs ! ça va te manger quelques octets sur la pile si t'es pas récursif terminal, sinon c'est impact 0.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Recurrence et Variable identique / Règles d'écritures

 

Sujets relatifs
[resolu]caracteres accentué (variable TEXT d'une table Mysql)Quel schéma relationnel est le bon ?
Composer un nom de variable...Recuperer variable d'un select multiple via javascript
Récupérer variable php d'un select multiple[resolu]Verification 'variable || contenu champ table mysql'
Concatener des nom de variableComment créer une variable dont le nom est dans une autre variable
[Résolu] Syntaxe : getElementById avec une variableappelle d une variable par une autre variable
Plus de sujets relatifs à : Recurrence et Variable identique / Règles d'écritures


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR