1

salut à tous, ca faisait longtemps

bon g un problème avec les arbres binaires, g bo lire et relire des tuto ca ve pas rentrer
prenons une application simple des arbres binaires, le calcul numerique

donc par exemple soit larbre suivant qui represente le calcul (2*3-5*4)*2
         *
       /  \
      -    2
    /   \
   /     \
  *      *
 /  \   /  \
2   3  5    4

si je prend la declaration de chaque neoud comme ci :
typedef struct noeud 
{
unsigned char data;
noeud* pere_gauche;
noeud* pere_droit;
}noeud;

donc definition standart qui represente ca :
 
            mon noeud
           /         \  
pere_gauche           pere_droit


putain je pige pas comment je peu effectuer le calcul!!!! vu que je ne peu QUE partir du * tout en haut vu que je remonte les papa et je descend pas les gnienfants
         *  <---- celui la
       /  \
      -    2
    /   \
   /     \
  *      *
 /  \   /  \
2   3  5    4

ainsi il fo redescendre mais a chaque fois que je redescend je dois prendre en compte un resultat imaginaire donc je comprend pas, ca commence a fumer par les oreilles tripaf

heam ... a l'aide cry
NTW !!!!!

2

struct node {
  char data;
  struct node *left;
  struct node *right;
};

int calc(struct node *n)
{
  switch (n->data) {
    case '+': return calc(n->left) + calc(n->right);
    case '*': return calc(n->left) * calc(n->right);
    ...
    default: return n->data - '0';
  }
}
So much code to write, so little time.

3

a uéééééééé putain trop balese le truc recurrent, putain excellentissime
j'y crois pas ca fait o moins 2 jours que je suis dessus et toi tu trouves ca en 5 min
ben merci infiniment
NTW !!!!!

4

5

matthieu :
a uéééééééé putain trop balese le truc recurrent, putain excellentissime
j'y crois pas ca fait o moins 2 jours que je suis dessus et toi tu trouves ca en 5 min
ben merci infiniment

C'est un "cas d'ecole" ce genre de pbm avec les arbres binaires
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

6

5 min, dont 3 pour lire la question ^^

7

matthieu> on appelle pas ça "pere_gauche", on appelle ça "fils_gauche" ^^ (le père, c'est le contraire du fils, et il y en a au plus un par noeud)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

merchi bcp a tous !!

mais juste comme ca, est ce que on peut se passer de la recursivité ?
vu que si mes souvenir sont bon, ya pas de recursivité en C non ?
et par simple curiosité, c possible ?
NTW !!!!!

9

En C, tu peux écrire des fonctions récursives.

Et c'est évidemment possible de s'en passer, rien qu'en la simulant, mais parfois en écrivant autrement le code...
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

10

voilà, c'est-à-dire qu'il te faudra un espace de stockage supplémentaire lié à la profondeur de l'arbre (ce qui peut être un peu pénible en C si tu ne veux pas la limiter arbitrairement)

dans ce cas précis, on ne doit pas pouvoir se débarrasser de cet espace supplémentaire (sauf si tu rajoutes une case "value" à ton arbre pour représenter la valeur calculée de l'expression, mais ça revient à prendre un espace supplémentaire ^^)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

11

ok je vois, merci infiniment pollux et sasume
NTW !!!!!

12

Ce livre est une lecture recommandée et un bouquin de référence toujours utile à avoir pas loin quand t'as besoin de faire des algorithmes.
En particulier si ça t'intéresse ils font la démonstration que tout algorithme itératif peut être traité récursivement et réciproquement.

13

Sasume :
En C, tu peux écrire des fonctions récursives.

matthieu > Le contraire aurait été triste ... Il y a peu de langages de haut niveau qui ne supportent pas la récursivité. (évidement, des langagues comme le COBOL, le meilleur aux dires de certains, a un petit problème avec par contre : pas de variable locales, donc l'intérêt en est réduit).
Sasume :
Et c'est évidemment possible de s'en passer, rien qu'en la simulant, mais parfois en écrivant autrement le code...

On peut toujours simuler la récursivité en utilisant des piles. Par contre, c'est plus fastidieux.

14

On peut toujours simuler la récursivité en utilisant des automates à quatre compteurs. Par contre, c'est plus fastidieux.
avatar
I'm on a boat motherfucker, don't you ever forget

15

c'est achement plus complexe a ecrire en itératif alors que le recursif permet du code moindre et généralement plus facile a maintenir/lire
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

16

le recursif cay bo hehe

17

Moumou :
On peut toujours simuler la récursivité en utilisant des automates à quatre compteurs. Par contre, c'est plus fastidieux.

C'est à dire ? Je pige pas.

Anyway, concrètement, en code, ça fait quoi ? Ce n'est pas intuitif de coder des automates, comme en électronique, dans un langage d'ordinateur (même l'assembleur), non ?
Godzil :
c'est achement plus complexe a ecrire en itératif alors que le recursif permet du code moindre et généralement plus facile a maintenir/lire

Effectivement (à moins de ne pouvoir faire autrement, à cause de contraintes de mémoire par exemple).
Nheryvra :
le recursif cay bo hehe

Le récursif, ça rock !

18

Quesoft
:
Godzil :
c'est achement plus complexe a ecrire en itératif alors que le recursif permet du code moindre et généralement plus facile a maintenir/lire

Effectivement (à moins de ne pouvoir faire autrement, à cause de contraintes de mémoire par exemple).

Hum si c'est bien codé (des deux coté) j'ai un penchant sur le fait que la methode itérative bouffe plus de mémoire, apres si la pile est tres limité en espace comparté a la mémoire c'est sur que...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

19

Godzil :
Hum si c'est bien codé (des deux coté) j'ai un penchant sur le fait que la methode itérative bouffe plus de mémoire, apres si la pile est tres limité en espace comparté a la mémoire c'est sur que...

L'itératif est prèsque toujours moins gourmand, parce que l'appel d'une fonction bouffe quand même assez de ressource sur la pile (adresse de retour + tous les paramètres + toutes les variables locales) et est relativement plus lent. C'est pour cela que je disais ça.

Bien sur, si on code dans un langage de haut niveau et qu'on utilise une pile dynamique (comme Vector en Java) au lieu d'un tableau statique, je ne serais plus prêt à parrier qu'il y a encore un gain à convertir en itératif.

20

[hs]
L'itératif est prèsque toujours moins gourmand, parce que l'appel d'une fonction bouffe quand même assez de ressource sur la pile (adresse de retour + tous les paramètres + toutes les variables locales) et est relativement plus lent. C'est pour cela que je disais ça.


Bien codé, je ne serais pas aussi catégoriques, pasque les variables locales (si tu en utilise) dans la version recursive tu en auras besoin aussi dans la version itérative, et il faut pour ça les sauver qq pars aussi.
L'adresse de retour ne fait que 4Octets sur un system 32Bit, faut pas oublier non plus que la version itérative aura besoin de variables en plus que la version recursive n'aura pas, bref on est pas forcement gagnant non plus.

Apres ça dépend des contraintes et du nombre de recursion qu'on est mené à faire

Et plus lent, je demande aussi vraiment a voir

essaye de faire moins lourd en mémoire/temps qu'un

typedef struct Liste_
{
   char *byte;
   Liste_ *next;
} Liste;

void FreeAll(Liste *Ptr)
{
  if (Ptr->next != NULL)
    FreeAll(Ptr->next)
  free(Ptr->byte);
}


Enfin c'est plus trop dans le sujet cheeky
[/hs]
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

21

Godzil :
essaye de faire moins lourd en mémoire/temps qu'un

typedef struct Liste_
{
   char *byte;
   Liste_ *next;
} Liste;

void FreeAll(Liste *Ptr)
{
  if (Ptr->next != NULL)
    FreeAll(Ptr->next)
  free(Ptr->byte);
}


Enfin c'est plus trop dans le sujet cheeky
[/hs]

Si je me trompe pas, ça donne qqc comme ça :

void freeAll(void *ptr) {
  void *pPrev = ptr;

  while (pPrev != NULL) {
    ptr = pPrev->next;
    free(pPrev);
    pPrev = ptr;
  }
}


Perso, je suis un fan de la récursivité en passant ... Je voullais juste dire que même si ça permet des solutions plus simples, qui ont moins de code, et qui sont plus élégantes, la récursivité ne permet pas d'atteindre de meilleures performances.

22

Quesoft> Avec ton code, les désallocations ne se font pas dans le même ordre qu'avec celui de Godzil. Mais le résultat final est le même.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

23

Sasume :
Quesoft> Avec ton code, les désallocations ne se font pas dans le même ordre qu'avec celui de Godzil. Mais le résultat final est le même.

Je sais, c'était plus simple comme ça...

Si l'on veut absolument désallouer dans le même sens, ça prend une pile :
#define push(i) (pile[pileTop++] = i)
#define pop() (pile[pileTop--])
#define empty() (pileTop == 0)

void freeAll(void *ptr) {
  void *pile[TAILLE_PILE];
  int pileTop = 0;

  while (ptr != NULL) {
    push(ptr);
    ptr = ptr->next;
  }

  while (!empty()) {
    free(pop());
  }
}


C'est laid, mais ça reste moins lourd que l'algo récursif.

<EDIT>
Correction d'un oubli dans une boucle.

24

Quesoft
:
Moumou :
On peut toujours simuler la récursivité en utilisant des automates à quatre compteurs. Par contre, c'est plus fastidieux.
C'est à dire ? Je pige pas.

Ben un automate à quatre compteurs (c'est à dire un simple automate fini, avec quatre objets qui ont des fonction +1, -1, et estNul) est turing complet, donc peut simuler la récursivité. Mais oui, c'est très fastidieux. Ce que je voulais dire par là, c'est que ta remarque ne sert à rien, parce qu'on peut simuler la récursivité avec à peu près tous les modèles de calcul que l'on veut.
avatar
I'm on a boat motherfucker, don't you ever forget

25

Moumou :
Ce que je voulais dire par là, c'est que ta remarque ne sert à rien, parce qu'on peut simuler la récursivité avec à peu près tous les modèles de calcul que l'on veut.

Ma remarque suivait un commentaire de Sasume. Elle exposait une solution couramment utilisée pour transformer un algo récursif en algo itératif.

26

-

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

27

C'est con de vouloir faire de l'itératif à tout prix quand la solution récursive est efficace, facile à écrire et à comprendre.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

28

C'est pas con, si tu veux faire de l'assembleur c'est souvent le meilleur moyen d'obtenir un code efficace... Evidemment en C on ne peut pas acceder a la pile manuellement, donc ca necessite un espace supplementaire, c'est un peu plus penible.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

29

En Asm, comme il n'y a pas de variables locales, on est oblige pour faire du recursif de passer par la pile et le pointeur (E)BP, mais la pile est d'une lenteur affligeante sick ...
Enfin du moins, ca c'est pour les programmes a flux direct (*.com) ; pour les autres (*.exe, ...), je n'en sais rien ...

@++
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

30

Je parle de problèmes du style parsing d'expressions arithmétiques, Tours de Hanoï, dans une moindre mesure le problème des 8 reines (en impératif, pas en fonctionnel ou en logique).
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.