Gambas France BETA


Pas de compte ? Incription

Récursivité dans un arbre

Ce sujet est résolu.

1
AuteurMessages
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 NEuronesSalut 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 NEuronesComme ç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 NEuronesDe rien xave4552,
comme disait l'autre : Qui ne se plante jamais n'a aucune chance de pousser !

:-)
;) Flachy Joe ;)
1