Chaque fois qu'une fonction s'appelle elle-même, la création d'une boucle, alors que c'est la récursivité. Comme avec n'importe quoi il y a de bons usages et à de mauvais usages de la récursivité.
Le plus simple est de la queue de la récursivité, où la dernière ligne de la fonction est un appel à elle-même:
int FloorByTen(int num)
{
if (num % 10 == 0)
return num;
else
return FloorByTen(num-1);
}
Cependant, c'est un boiteux, presque inutile exemple, car il peut facilement être remplacé par des plus efficaces itération. Après tout, la récursivité souffre d'un appel de fonction, les frais généraux, qui, dans l'exemple ci-dessus pourrait être importante par rapport à l'exploitation, à l'intérieur de la fonction elle-même.
Ainsi, l'ensemble de raison de faire de la récursivité plutôt que d'itération devrait être de prendre avantage de la pile d'appel pour faire quelques trucs forts. Par exemple, si vous appelez une fonction plusieurs fois avec des paramètres différents à l'intérieur de la boucle, alors que c'est un moyen pour accomplir la ramification. Un exemple classique est le triangle de Sierpinski.
Vous pouvez dessiner un de ces très simplement avec la récursivité, où la pile d'appel des succursales dans 3 directions:
private void BuildVertices(double x, double y, double len)
{
if (len > 0.002)
{
mesh.Positions.Add(new Point3D(x, y + len, -len));
mesh.Positions.Add(new Point3D(x - len, y - len, -len));
mesh.Positions.Add(new Point3D(x + len, y - len, -len));
len *= 0.5;
BuildVertices(x, y + len, len);
BuildVertices(x - len, y - len, len);
BuildVertices(x + len, y - len, len);
}
}
Si vous essayez de faire la même chose avec des itérations je pense que vous trouverez cela prend beaucoup plus de code à accomplir.
D'autres cas d'utilisation courants peuvent inclure la traversée des hiérarchies, par exemple un site web crawlers, répertoire des comparaisons, etc.
Conclusion
En termes pratiques, la récursivité qui fait le plus de sens quand vous en avez besoin itératif de ramification.