Здравствуйте, Undying, Вы писали:
U>Здравствуйте, Dog, Вы писали:
U>>>U>>> int p = int.MinValue;
U>>> if (arr.Any(x => p > (p = x) ))
U>>> Console.WriteLine("Не упорядочена");
U>>>
U>>>Здесь это вроде прокатывает, но на более сложных задач это чревато ошибками, соответственно превосходство над старым-добрым foreach'ем теряется.
Dog>>Что вы имеете ввиду?
U>Да и вообще это просто хак, который в другом случае бы не прокатил, например, если бы условие было не строгое больше, а больше-равно, то int.MinValue уже использовать было бы нельзя.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, k.o., Вы писали:
KO>>Здравствуйте, gandjustas, Вы писали:
G>>>Здравствуйте, k.o., Вы писали:
KO>>Как здесь поможет оптимизация хвостовой рекурсии и может-ли GC собрать root, до завершения работы RecursiveNodeCount(root.Left) и вызова RecursiveNodeCount(root.Right)?с
G>Ну покажи эквивалентный код с циклами, где собираться будет.
С какой это радости? Код с циклами я приводил выше, о том что он эквивалентен рекурсивному я никогда не говорил, как раз наоборот. Прочитай внимательней дискуссию с Undying начиная
отсюдаАвтор: k.o.
Дата: 07.08.10
, вот краткая выжимка:
U> Использовать рекурсию нужно только там где без этого никак не обойтись.
Я> Без рекурсии можно обойтись всегда, вот пример.
U> Хорошо, использовать рекурсию нужно только там где нет возможности избавиться от хранения стека состояний.
Я> В моём примере, у явного управления стеком есть свои преимущества.
Ты> покажи эквивалентный код с циклами.
Я>
Хотя, надо признать, тут я не подумал, сборку узлов, после незначительного изменения можно получить и для рекурсивного кода.
int RecursiveNodeCount(Tree root)
{
if (root == null)
{
return 0;
}
var right = root.Right;
return 1 + RecursiveNodeCount(root.Left) + RecursiveNodeCount(right);
}
Но разница всё же есть: если в рекурсивном варианте об этом нужно специально позаботиться, то в коде с циклами это результат прямолинейного подхода.
KO>>>>2) в случае слишком глубокой рекурсии мы получим OutOfMemoryException, а не StackOverflowException, при котором даже блоки finally не выполняются.
G>>>Покажи код где такое происходит.
KO>>Что происходит? OutOfMemoryException? StackOverflowException? Код настолько тривиален, что, подозреваю, я неправильно тебя понял.
G>Реальный рекурсивный код где происходит OutOfMemoryException, но не происходит StackOverflowException.
G>И как помогут циклы в этом случае?
Прошу прощения, не думал, что мои слова будут настолько неправильно поняты. Ещё раз: в тех случаях, в которых использование рекурсии приведёт к StackOverflowException,
эмуляция рекурсии через циклы и ручное управление стеком, приведёт, в худшем случае, к OutOfMemoryException.