Bonjour à tous et à toutes.

Ces derniers temps, je test quelques approches sur un algorithme. Il s'agit d'un algo de parcours de tableau 2D façon "parcours depuis un point donné". Ma première approche est récursive et se présente comme suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
void Fonction(int x, int y)
{
<div style="margin-left:40px">if (...) // condition d'arret
<div style="margin-left:40px">return;</div>
tableau[x, y] ... // do stuff
 
Fonction(x + 1, y);
Fonction(x - 1, y);
Fonction(x, y + 1);
Fonction(x, y - 1);</div>}
A l'usage, je n'ai pas trouvé cette approche très performante et ai voulu me passer de la récursion, ayant lu par ci par la les tendances de .NET à ce sujet, et histoire d'éviter des StackOverflow sur des récursions trop profondes.

J'ai donc adpaté mon algo d'une façon assez classique, en empilant les paramtères :

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
18
19
20
21
22
23
24
25
26
27
 
struct Pos
{
<div style="margin-left:40px">int x, y;
public Pos(int _x, int _y)
{
<div style="margin-left:40px">x = _x;
y = _y;</div>}</div>}
 
void Fonction2(int x, int y)
{
<div style="margin-left:40px">Stack<Pos> stack = new Stack<Pos>(); // eventuellement spécifier la taille de la pile lorsque je connais la profondeur
Pos p = new Pos(x, y);
 
stack.Push(p);
 
while (stack.Count > 0)
{
<div style="margin-left:40px">p = stack.Pop();
if (...) // condition d'arret
<div style="margin-left:40px">continue;</div>
tableau[p.x, p.y] ... // do stuff
 
stack.Push(new Pos(p.x + 1, p.y));
stack.Push(new Pos(p.x - 1, p.y));
stack.Push(new Pos(p.x, p.y + 1));
stack.Push(new Pos(p.x, p.y - 1));</div>}</div>}
Mystère et boule de gomme, la version à pile est 10% moins performante que la version récursive.
Les deux fonctions sont vérifiées, même nombre d'itérations et même résultat.

La question : est-ce que je fais quelque chose de mal dans mon approche non récursive ou est-ce normal ?

Merci d'avance pour les clarifications, je suis curieux de savoir ce que .NET traffique derrière.