Je me demande pourquoi la première fois que je reçois un VS/Resharper note que la récursion de la queue pourrait être remplacée par une boucle, et j'ai effectivement réussi à obtenir quelque chose de similaire pour provoquer un débordement de pile alors je lis comment les récursions de queue fonctionnent et comment il développe la pile, etc.Cette queue est-elle récursive et pourrait-elle provoquer un débordement de pile? C# .Net
Ce premier génère la note de récurrence de queue.
private static string GetLine()
{
string s = Console.ReadLine();
if (s == null)
{
return GetLine();
}
return s;
}
Mais le faire comme cela ne:
private static string GetLine()
{
string s = Console.ReadLine();
if (s == null)
{
s = GetLine();
}
return s;
}
Alors ma question est; le second n'est-il pas considéré comme récursif, c'est-à-dire qu'il ne peut pas créer un débordement de pile car il ne génère pas tous les appels de pile?
Vous l'avez obtenu en arrière, * récursivité de la queue * ne générera pas de débordements de pile, mais un appel récursif non-queue peut. –
Dans tous les cas, C# ne garantit pas que même lorsque l'optimisation de l'appel de fin de ligne * peut * être effectuée, elle est réellement * effectuée *. Cela peut donc créer un débordement de pile de toute façon (cela arrivera aussi, sauf parfois sur x64) – harold
@LucasTrzesniewski, naïf [tail récursion] (https://fr.wikipedia.org/wiki/Tail_call) * va générer une pile débordement, sauf si un opérateur existe dans le système (et est correctement utilisé) pour optimiser ce scénario. Le CLR a un tel opcode ('tail'). C# n'a pas de véhicule pour tirer parti de cet opcode de manière fiable. –