Re[7]: [Linq] проверить последовательность
От: Dog  
Дата: 09.08.10 11:03
Оценка:
Здравствуйте, 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 уже использовать было бы нельзя.
Re[16]: [Linq] проверить последовательность
От: k.o. Россия  
Дата: 09.08.10 14:06
Оценка: +1
Здравствуйте, 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.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.