xave4552 | #1 Posté le 29/11/2015 à 15:07:15 |
---|
| Bonjour à tous, Je suis créer actuellement une classe d'arbre (non binaire avec un parent et n enfants). Voila tous ce passe bien pour l'ajout ainsi que une fonction récursive qui doit me récupéré l'ensemble des clef de l'arbre. Cependant depuis 2 jours je veux créer une fonction récursive qui me renvoie un nœud ou une feuil suivant sa clef. Je trouve bien la clef ainsi que l'objet correspondant dans l'arbre cependant la fonction de retour ne fonctionne pas et la fonction s’interrompt bien au bon moment. Avez une idée pour que le retour ce passe correctement ou dois-je revoir entièrement mon algo?
Nota cette classe n'est pas encor finit.
La fonction qui me pose problème est la suivante: STATIC PUBLIC FUNCTION Recherche_Noeud(Arbre AS Classe_Travaille, Clef AS STRING, OPTIONAL Noeud_Courant AS Classe_Travaille = NULL) AS Classe_Travaille
a la ligne 155.
La classe nomée:Classe_Travaille
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
| ' Gambas class file
INHERITS Point PRIVATE $Parent AS Classe_Travaille PRIVATE $Enfant AS Classe_Travaille[]
PRIVATE $Clef AS STRING
PRIVATE $Root AS BOOLEAN
PUBLIC SUB _new(OPTIONAL Parent AS Classe_Travaille = NULL)
IF IsNull(Parent) THEN $Root = TRUE $Parent = NULL
ELSE $Root = FALSE $Parent = Parent ENDIF $Clef = Generation_Clef() $Enfant = NEW Classe_Travaille[]
END
PROPERTY READ ROOT AS BOOLEAN
PRIVATE FUNCTION ROOT_Read() AS BOOLEAN
RETURN $root
END
PROPERTY READ Parent AS Classe_Travaille ' Property Parent As Classe_Travaille
PRIVATE FUNCTION Parent_Read() AS Classe_Travaille
RETURN $Parent
END ' ' Private Sub Parent_Write(Value As Classe_Travaille) ' ' $Parent = Value ' ' End
PROPERTY READ Enfant AS Classe_Travaille[]
PRIVATE FUNCTION Enfant_Read() AS Classe_Travaille[]
RETURN $Enfant
END
PRIVATE SUB Enfant_Write(Value AS Classe_Travaille[])
$Enfant = Value
END
PROPERTY READ Clef AS STRING
PRIVATE FUNCTION Clef_Read() AS STRING
RETURN $Clef
END
PRIVATE FUNCTION Generation_Clef() AS STRING
DIM retour AS STRING DIM numerique AS BOOLEAN DIM majuscule AS BOOLEAN DIM i AS INTEGER
IF Rnd() >= 0.5 THEN majuscule = TRUE ENDIF IF majuscule = TRUE THEN retour &= Chr(Rnd(65, 90)) ELSE retour &= Chr(Rnd(97, 122)) ENDIF
FOR i = 0 TO 30 IF Rnd() >= 0.5 THEN numerique = TRUE ENDIF IF numerique = TRUE THEN retour &= Chr(Rnd(48, 57)) ELSE IF Rnd() >= 0.5 THEN majuscule = TRUE ENDIF IF majuscule = TRUE THEN retour &= Chr(Rnd(65, 90)) ELSE retour &= Chr(Rnd(97, 122)) ENDIF ENDIF numerique = FALSE majuscule = FALSE NEXT RETURN retour
END
STATIC PUBLIC FUNCTION Ensemble_Clef(Arbre AS Classe_Travaille, OPTIONAL Retour AS String[] = NULL) AS String[]
DIM Noeud_Courant AS Classe_Travaille
IF IsNull(Retour) THEN Retour = NEW String[] Noeud_Courant = Arbre 'On remonte jusqu'a trouvée la racine de l'arbre WHILE Noeud_Courant.ROOT = FALSE Noeud_Courant = Noeud_Courant.Parent WEND 'On affecte la racine à l'objet courant Arbre = Noeud_Courant ENDIF 'On commance la récursivité FOR EACH Noeud_Courant IN Arbre.Enfant Ensemble_Clef(Noeud_Courant, retour) NEXT 'On vient chercher la propriété que l'on veux Retour.Add(Arbre.Clef) RETURN Retour
END
STATIC PUBLIC FUNCTION Clef_Fils(Arbre AS Classe_Travaille, OPTIONAL Retour AS String[] = NULL) AS String[]
DIM Noeud_Courant AS Classe_Travaille
IF IsNull(Retour) THEN Retour = NEW String[] Noeud_Courant = Arbre
'On affecte la racine à l'objet courant Arbre = Noeud_Courant ENDIF 'On commance la récursivité FOR EACH Noeud_Courant IN Arbre.Enfant Ensemble_Clef(Noeud_Courant, retour) NEXT 'On vient chercher la propriété que l'on veux Retour.Add(Arbre.Clef) RETURN Retour
END
STATIC PUBLIC FUNCTION Recherche_Noeud(Arbre AS Classe_Travaille, Clef AS STRING, OPTIONAL Noeud_Courant AS Classe_Travaille = NULL) AS Classe_Travaille
DIM Tmp AS Classe_Travaille IF IsNull(Noeud_Courant) THEN Noeud_Courant = Arbre 'On remonte jusqu'a trouvée la racine de l'arbre WHILE Noeud_Courant.ROOT = FALSE Noeud_Courant = Noeud_Courant.Parent WEND Recherche_Noeud(Arbre, Clef, Noeud_Courant) ELSE FOR EACH tmp IN Noeud_Courant.Enfant IF Comp(tmp.Clef, Clef) = 0 THEN RETURN tmp ELSE Recherche_Noeud(Arbre, Clef, tmp) ENDIF NEXT
ENDIF
END
|
|
Flachy Joe | #2 Posté le 30/11/2015 à 09:47:14 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | Salut xave4552, Tu as dans ta fonction Recherche_Noeud, 2 cas sur 3 qui ne renvoient pas de résultat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| FUNCTION Recherche_Noeud(...) IF IsNull(Noeud_Courant) THEN [...] Recherche_Noeud(Arbre, Clef, Noeud_Courant) 'ICI on sort de la fonction sans résultat ELSE FOR EACH tmp IN Noeud_Courant.Enfant IF Comp(tmp.Clef, Clef) = 0 THEN RETURN tmp 'ICI on sort de la fonction avec le bon résultat ELSE Recherche_Noeud(Arbre, Clef, tmp) 'ICI on sort de la fonction sans résultat ENDIF NEXT
ENDIF
END
|
Le résultat ne remonte donc pas ta chaîne de récursivité, il faut songer que c'est uniquement le résultat du PREMIER appel qui est finalement récupéré. Pour le premier cas c'est facile :
1
2
3
4
5
6
7
8
9
10
| FUNCTION Recherche_Noeud(...) IF IsNull(Noeud_Courant) THEN [...] RETURN Recherche_Noeud(Arbre, Clef, Noeud_Courant) ELSE [...] ENDIF
END
|
Pour le second, il faut modifier la fonction pour qu'elle envoi un résultat vide si aucun des fils n'a le résultat et renvoyer au parent uniquement si on a la bonne clef. Flachy Joe |
xave4552 | #3 Posté le 1/12/2015 à 22:54:53 |
---|
| Salut, Je n'ai toujours pas trouver après de multiple modification (et je pense qu'il y a un petit problème de compilateur faut que je fouille), je vais essayé ce week-end en c++, car j'avais déjà implanté une classe comme sa en vb et en c et cela fonctionné (mais il y a longtemps). Merci de ta réponse ++ |
Flachy Joe | #4 Posté le 2/12/2015 à 21:23:55 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | Comme ça ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| STATIC PUBLIC FUNCTION Recherche_Noeud(Arbre AS Classe_Travaille, Clef AS STRING, OPTIONAL Noeud_Courant AS Classe_Travaille = NULL) AS Classe_Travaille
DIM Tmp AS Classe_Travaille, Res AS Classe_Travaille IF IsNull(Noeud_Courant) THEN Noeud_Courant = Arbre 'On remonte jusqu'a trouvée la racine de l'arbre WHILE Noeud_Courant.ROOT = FALSE Noeud_Courant = Noeud_Courant.Parent WEND RETURN Recherche_Noeud(Arbre, Clef, Noeud_Courant) ELSE FOR EACH tmp IN Noeud_Courant.Enfant IF Comp(tmp.Clef, Clef) = 0 THEN 'L'enfant a la clef RETURN tmp ELSE 'On cherche chez les petits-enfants Res=Recherche_Noeud(Arbre, Clef, tmp) IF NOT IsNull(Res) THEN 'Un petit-enfant a la clef, on la fait remonter la chaîne d'appel RETURN Res ENDIF ENDIF NEXT 'Aucun des enfants ni petit-enfants n'a la clef RETURN NULL ENDIF
END
|
Flachy Joe |
xave4552 | #5 Posté le 3/12/2015 à 20:24:17 |
---|
| Salut, Je sais d’où cela venais, return non mis quel idiot........... Merci |
Flachy Joe | #6 Posté le 3/12/2015 à 22:42:59 |
---|
Iguane : Il Gambas Uniquement pour Activer ses NEurones | De rien xave4552, comme disait l'autre : Qui ne se plante jamais n'a aucune chance de pousser !
:-) Flachy Joe |