Re[7]: C# goto, нужно ли избегать
От: Undying Россия  
Дата: 15.04.11 09:00
Оценка:
Здравствуйте, WolfHound, Вы писали:

U>>Приведенный тобой код, кстати, зело кошмарен, т.к. по нему совершенно не видно, что является результатом выполнения этого куска кода.

WH>А что по коду в топиккастера понятно?

Объясню, почему твой код столь же плох как код топикстартера.

Код топикстартера плох по трем причинам:

1) В нем есть переиспользовании переменных ради экономии на спичках (stack детей по смыслу задачи должен пересоздаваться).
2) Непонятно является ли обратный порядок обхода детей важным по условию задачи или таким он получился случайно.
3) Код обхода дерева смешан с кодом обработки элементов.

В твоем коде все эти проблемы остались, поэтому твой код ничем не лучше.
Re[2]: C# goto, нужно ли избегать
От: Философ Ад http://vk.com/id10256428
Дата: 15.04.11 09:00
Оценка:
Здравствуйте, Undying, Вы писали:

U>Порядок обработки объектов одного уровня в дереве имеет значение или в алгоритме такой порядок случайно получился?


Я ещё не родил конечного алгоритма (меня тут немного заклинило). Когда это писалось, то думал, что имеет, поэтому ответ, наверное да.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: C# goto, нужно ли избегать
От: Abyx Россия  
Дата: 15.04.11 09:25
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Мне интересно с каким из озвученных фактов не согласны минусующие?


С тем что C# тупой язык; с тем что вы не можете написать хороший код на C# потому что C# тупой язык.

C# нормальный язык. Не хуже и не лучше других. Алгоритмы они вообще во всех языках выглядят примерно одинаково, а то что где-то есть хвостовая рекурсия, замыкания, генераторы, сопрограммы, и другие редкие фичи не делает язык "умнее". Применение хитрых вещей не повышает читабельность. В данном случае, применение хвостовой рекурсии требует того чтобы читающий проверил что там действительно хвостовая рекурсия.

Алсо, у ТСа есть проблема, и ему надо ее решить. В вопросе есть слово "С#" и по всей видимости это значит что ТСу надо решение на C#. Ваше стремление показать что вы знаете другие языки кроме C#, никоим образом не решает проблему ТСа.

Кроме того, ваша функция слишком большая, имеет неинформативное название, делает слишком много, не должна компилироваться вообще из за неиспользуемых переменных (хз как там у немерла, а у меня на C++ такое бы не скомпилировалось), допускает что count может быть <= 0.

Вот за эти понты вкупе с дурно пахнущим кодом, я поставил вам -1.
In Zen We Trust
Re[8]: C# goto, нужно ли избегать
От: WolfHound  
Дата: 15.04.11 09:26
Оценка: +1
Здравствуйте, Undying, Вы писали:

U>В этой задаче не съедят, т.к. тут вообще рекурсия не нужна.

А как по мне так это циклы не нужны.

U>А там где рекурсия нужна действительно, там хвостовая рекурсия не помощник.

А как на счет случаев когда одна и таже функция может вызываться хвостовым и не хвостовым образом?
Вот например:
      def optimize(r : Rule)
      {
        | Not(Not(rule))                => optimize(Rule.And(r.Location, rule))
        | And(Not(rule))                => optimize(Rule.Not(r.Location, rule))
        | Not(And(rule))                => optimize(Rule.Not(r.Location, rule))
        | And(And(rule))                => optimize(Rule.And(r.Location, rule))
        | Not(rule)                     => Rule.Not(r.Location, optimize(rule))
        | And(rule)                     => Rule.And(r.Location, optimize(rule))

Тут есть и те и другие вызовы.
Или можно вспомнить про qsort. Там тоже один рекурсивный вызов хвостовой, а другой нет.

И если уж придираться до конца то рекурсия вообще не нужна. Всегда можно переписать на циклах, а стек ручками завести.

U>Твой код ничем не лучше кода топикстартера или варианта с while, такая же непонятная муть.

Лучше. Я явно выделил обработку.
А для того чтобы сделать хороший код этого куска не достаточно. Нужно знать всю задачу. И решать ее по хорошему.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: C# goto, нужно ли избегать
От: WolfHound  
Дата: 15.04.11 09:44
Оценка: +2
Здравствуйте, Abyx, Вы писали:

A>C# нормальный язык. Не хуже и не лучше других.

Рассказывай это тем кто других языков не видел.

A>Алгоритмы они вообще во всех языках выглядят примерно одинаково, а то что где-то есть хвостовая рекурсия, замыкания, генераторы, сопрограммы, и другие редкие фичи не делает язык "умнее".

Ага конечно.
https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/Nemerle.Peg.Macros/Optimizer/Optimizer.OptimizeRule.n?r=9596
Удачи с переписывание этого на C#. Как минимум 5 кратное разбухание кода гарантировано.

A>Применение хитрых вещей не повышает читабельность. В данном случае, применение хвостовой рекурсии требует того чтобы читающий проверил что там действительно хвостовая рекурсия.

Зачем проверять? Там и так видно что рекурсия хвостовая.

A>Алсо, у ТСа есть проблема, и ему надо ее решить. В вопросе есть слово "С#" и по всей видимости это значит что ТСу надо решение на C#. Ваше стремление показать что вы знаете другие языки кроме C#, никоим образом не решает проблему ТСа.

И задал свой вопрос в философи...

A>Кроме того, ваша функция слишком большая,

8 строк не считая скобочек. Это уже большая функция?

A>имеет неинформативное название,

А какое еще название ей дать если задача не известна?

A>делает слишком много,

Что она делала у топикстартера то и делает.

A>не должна компилироваться вообще из за неиспользуемых переменных (хз как там у немерла, а у меня на C++ такое бы не скомпилировалось), допускает что count может быть <= 0.

Ты свой код то смотрел?
Автор: Abyx
Дата: 14.04.11
Там тот же самый count. Который нигде не объявлен. И с которым то же ничего не делается.

A>Вот за эти понты вкупе с дурно пахнущим кодом, я поставил вам -1.

Весь твой пост это одни сплошные понты.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: C# goto, нужно ли избегать
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.04.11 17:10
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Алсо, у ТСа есть проблема, и ему надо ее решить.


Мне кажется, что его единственная его проблема — это желание обосновать для себя правильность использования goto.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: C# goto, нужно ли избегать
От: fddima  
Дата: 15.04.11 23:01
Оценка:
Здравствуйте, VladD2, Вы писали:

A>>Алсо, у ТСа есть проблема, и ему надо ее решить.

VD>Мне кажется, что его единственная его проблема — это желание обосновать для себя правильность использования goto.
Ну и правильный вопрос. Нормальная практика (на C#) его требует, но лучше без него.
Re[6]: C# goto, нужно ли избегать
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.04.11 10:08
Оценка:
Здравствуйте, fddima, Вы писали:

VD>>Мне кажется, что его единственная его проблема — это желание обосновать для себя правильность использования goto.

F> Ну и правильный вопрос.

Что тут правильного? Раз хочет обоснований, значит и сам сомневается. А в хороших делах обычно не сомневаются.

F> Нормальная практика (на C#) его требует, но лучше без него.


Я написал не мало кода на C#. goto ни разу не потребовался.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: C# goto, нужно ли избегать
От: Undying Россия  
Дата: 23.04.11 13:32
Оценка:
Здравствуйте, WolfHound, Вы писали:

По поводу хвостовой рекурсии я был не прав, поэтому исправляюсь.

U>>И в чем проблема? Анонимные делегаты в шарпе уже пять лет как имеются.

WH>Вот только они весь стек съедят.

Т.е. на запись кода, а, значит, и его читабельность, оптимизация хвостовой рекурсии никак не влияет, это чисто оптимизационная фишка, причем актуальная на достаточно специфических задачах. Соответственно если бы в шарпе такая оптимизация появилась, не ухудшив никаких других качеств языка, то можно было бы сказать, что язык стал чуточку лучше. Ты же заявляешь, что язык без оптимизации хвостовой рекурсии является тупым и на нем вообще писать нельзя, т.е. выдаешь второстепенную фичу за самую важную возможность языка.
Re[8]: C# goto, нужно ли избегать
От: hardcase Пират http://nemerle.org
Дата: 24.04.11 08:41
Оценка:
Здравствуйте, Undying, Вы писали:

U>Ты же заявляешь, что язык без оптимизации хвостовой рекурсии является тупым и на нем вообще писать нельзя, т.е. выдаешь второстепенную фичу за самую важную возможность языка.


Это зависит от архитектуры языка. Для одного языка это — "второстепенная фишка", в другом же — насущная необходимость, без которой ничего вообще работать не будет.
На практике я частенько использую рекурсию в C#, и не сказал бы что в её использовании есть что-то специфическое. Более того, недавно я даже переписывал рекурсивное решение на цикл с рукопашным стеком именно из-за отсутствия такой оптимизации.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: C# goto, нужно ли избегать
От: vdimas Россия  
Дата: 05.05.11 02:42
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я не буду приводить примера того как этот код можно было бы переписать без goto. Я просто скажу что твой код — говно. Или как его любят называть в народе — говнокод. Читать его сложно и уныло.


Ну, от того, что в этом коде появится дополнительная переменная bool canExit или того хуже, бесконечный while(true) {} + break внутри, он краше не станет.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.