@th0m4sXD

Как работает рекурсия при итерации?

Реализую простой обход двоичного дерева рекурсией, почему при итерации не происходит рекурсивный вызов traverse(current.left); и traverse(current.right); ? Просто возвращается одно значение yield return current.value;
IEnumerator traverse(Node current) {
		if (current != null)
		{
			traverse(current.left);
			yield return current.value;
			traverse(current.right);
		}
	}

	public IEnumerator GetEnumerator()
	{
		return traverse(core);
	}
  • Вопрос задан
  • 410 просмотров
Решения вопроса 1
NightmareZz
@NightmareZz
Нищий разработчик из Симферополя
IEnumerable<T> traverse(Node current) {
    if (current != null)
    {
        foreach (var value in traverse(current.left))
            yield return value;

        yield return current.value;

        foreach (var value in traverse(current.right))
            yield return value;
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
yield return всего лишь запоминает текущее положение итератора. Поэтому yield return current.value будет возвращать одно и тоже значение, первое, т.к. Вы не итерируетесь по коллекции traverse(node), нет методов, которые сделают MoveNext(). Посмотрите на вариант Михаил Макаров, там итерация происходит с помощью foreach.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы