Как стать автором
Обновить

Комментарии 3

Вам бы следовало как раз привести пример рекурсивного алгоритма. Сейчас он у вас просто циклический. Для рекурсии такой код применим только в условиях совсем маленьких объёмов данных. Компилятор не «склеивает» вложенные итераторы один экземпляр объекта, каждый вызов foreach создаёт итератор. Обход дерева итераторами привел бы к созданию итераторов, в количестве равном числу нелистовых узлов. Это дополнительная нагрузка на сборщик мусора. Кроме того, при большой глубине дерева узел бы возвращался через весь стек итераторов, т.е. для получения узла надо было бы произвести N-ное кол-во вызовов метода IEnumerator.get_Current() что не быстро. Для дерева гораздо эффективнее использовать Stack<T> внутри итератора верхнего уровня. Подоход со стеком работает примерно в 25 раз быстрее.
Всё, что я написал, хорошо изложено здесь: blogs.msdn.com/b/toub/archive/2004/10/29/249858.aspx
Отличный комментарий! Вы ответили на последний вопрос из статьи.

Вам бы следовало как раз привести пример рекурсивного алгоритма. Сейчас он у вас просто циклический.
То, что вы прочитали является переводом статьи, а не оригинальная статья. По мере своих возможностей я старался не искажать текст.
А, это же Реймонд Чен :) Я сразу внимание не обратил.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории