using System.Collections.Generic;
using System.Threading.Tasks;
RecursiveStructure data = new()
void NormalRecursion(RecursiveStructure data, int depth = 0)
Console.WriteLine($"NR depth {depth}");
if (data.Inner is RecursiveStructure inner)
NormalRecursion(inner, ++depth);
void QueueRecursion(RecursiveStructure data, int depth = 0)
var queue = new Queue<(RecursiveStructure, int)>();
queue.Enqueue((data, depth));
var (currentData, currentDepth) = queue.Dequeue();
Console.WriteLine($"QR depth {currentDepth}");
if (currentData.Inner is RecursiveStructure inner)
queue.Enqueue((inner, ++currentDepth));
void StackRecursion(RecursiveStructure data, int depth = 0)
var stack = new Stack<(RecursiveStructure, int)>();
stack.Push((data, depth));
var (currentData, currentDepth) = stack.Pop();
Console.WriteLine($"SR depth {currentDepth}");
if (currentData.Inner is RecursiveStructure inner)
stack.Push((inner, ++currentDepth));
public RecursiveStructure? Inner {get; init;}