Переполнение стека при рекурсии c#
Всем привет! Пишу метод, которые будет проходится по графу depth-first методом. Вот мой код:
public static IEnumerable<T> DepthTraversalTree<T>(ITreeNode<T> root)
{
List<T> list = new List<T>();
if ((int)Convert.ChangeType(root.Data, typeof(int)) == 99999)
return list;
list.Add(root.Data);
if (!(root.Children == null))
foreach (var item in root.Children)
{
list.Add(item.Data);
if (!(item.Children == null))
{
var s = DepthTraversalTree(item);
for (int i = 1; i < s.Count(); i++)
{
list.Add(s.ToArray()[i]);
}
}
}
return list;
}
Не большие графы проходит без проблем. Но когда я отправляю граф на 100000 записей в глубину, выбрасывает Stackoverflow исключение. Буду благодарен за любую помощь)
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Стек - штука небольшая, не нужно засовывать в него такую кучу списков. Со стеком надо бережно.
Список у вас сквозной, так что можно использовать его по ссылке, а создать один раз.
public static IEnumerable<T> DepthTraversalTree<T>(ITreeNode<T> root)
{
List<T> list = new List<T> { root.Data };
if (root.Children?.Count > 0)
{
DepthTraversalTree(root, list);
}
return list;
}
private static void DepthTraversalTree<T>(ITreeNode<T> node, List<T> list)
{
if ((int)Convert.ChangeType(node.Data, typeof(int)) == 99999)
return;
foreach (var item in node.Children)
{
list.Add(item.Data);
if (item.Children?.Count > 0)
{
DepthTraversalTree(item, list);
}
}
}