|
|
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Имеется простейшая структура данных: дерево, где элемент имеет ссылку на родителя. Нужна функция, определяющая, является ли один элемент дочерним для второго. Пишу функцию, которая бы просто делала то, что мне нужно: Пишу рекурсивную функцию следующим образом (мой код на C# просто потому что мне так удобнее): Код: c# 1. 2. 3. 4. 5. Я вижу, что она может быть реализована лучше: здесь присутствует разлапистый if, неудобно определены условия сравнения. Хотелось бы сделать по-правильному. Как это сделать на этом игрушечном примере? P.S. Логика подсказывает, что нужно определить границы, задать начальные условия и стартовать этот механизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 09:02 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Если порядок исполнения выражения в C# определен, то можно так Код: c# 1. 2. 3. Правда тут теперь нет хвостовой рекурсии, но C# кажись и так ее не не обрабатывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 09:25 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Еще parent == item можно убрать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 09:28 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
лучше циклом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 09:30 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
enigmaticИмеется простейшая структура данных: дерево, где элемент имеет ссылку на родителя. Нужна функция, определяющая, является ли один элемент дочерним для второго. Пишу функцию, которая бы просто делала то, что мне нужно: Пишу рекурсивную функцию следующим образом (мой код на C# просто потому что мне так удобнее): Код: c# 1. 2. 3. 4. 5. Я вижу, что она может быть реализована лучше: здесь присутствует разлапистый if, неудобно определены условия сравнения. Хотелось бы сделать по-правильному. Как это сделать на этом игрушечном примере? P.S. Логика подсказывает, что нужно определить границы, задать начальные условия и стартовать этот механизм. Код: c# 1. 2. 3. 4. 5. или Код: c# 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 09:32 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Или без рекурсии (побережем стек) правда теряем возможность перекрыть IsChildOf для каких-то видом айтемов Код: c# 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 09:33 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
F#, Спасибо, так гораздо лучше. Яростный Меч, Нет. В данном случае - нет. k0rvin, Спасибо. Значит, все-таки я недалеко от истины ушел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 09:36 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Признаться, все это очень интересно: >Если порядок исполнения выражения в C# определен >Правда тут теперь нет хвостовой рекурсии >C# кажись и так ее не не обрабатывает >без рекурсии (побережем стек) // то, что всегда можно без рекурсии >правда теряем возможность перекрыть IsChildOf для каких-то видом айтемов Почему? >(побережем стек) Дерево обещает быть небольшим, но спасибо за то, что обратили внимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 09:46 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
enigmatic>правда теряем возможность перекрыть IsChildOf для каких-то видом айтемов Почему? Потому, что потомок не вызывает isChildOf родителя. Если вдруг у родителя какая-то своя реализация (например нескольо парентов) то она не отработает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 10:44 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
enigmatic public bool IsChildOf(ColumnViewTreeItem item) { if (Parent == null) return false; if (Parent == item || this == item) return true; return Parent.IsChildOf(item); } Иногда практика сама подсказывает в каком порядке и как проверять. Бывают случаи когда например одна проверка срабатывает в 0.001% случаев а другие в 99.999%. Тогда эти проверки в коде просто меняют местами. Казалось-бы пустяк но на рекурсии или каких-то особо жостких численных методах это важно. Если терпит я вечером полистаю книгу. Кажется "Жемчужины программирования" там были примеры профиляторов для таких предикатов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 12:57 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
mayton, если в данном случае поменять проверки местами, то есть шанс схватить исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 20:10 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Какое исключение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 20:18 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Яростный Мечлучше циклом +1 простой перебор по парентам до искомого родителя / корня. и никаких рекурсий там ненадо в принципе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 20:43 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Вам тут видимо больше делать нечего, как обсуждать три несчастные строчки кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2012, 21:33 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Яростный Мечлучше цикломeNose+1 простой перебор по парентам до искомого родителя / корня. и никаких рекурсий там ненадо в принципе.Всегда лучше или только в данном случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 07:41 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
mayton, Терпит, но спасибо. MasterZiv, Вам тут видимо больше делать нечего, как обсуждать как другие обсуждают три несчастные строчки кода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 07:45 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
enigmaticВсегда лучше или только в данном случае? рекурсия нужна ровно для наоборот - обойти дерево (часть дерева), начиная с какого-то элемента. рекурсивно вызывая саму себя, есть возможность вернуться на предыдущий элемент. зачем при проверке на парент использовать рекурсию, если у дочернего всегда ОДИН родитель? конечно, проверять можно двумя способами: 1) рекурсивно обойти всё дерево, начиная с элемента А1. искать элемент А2. если нашли - значит А2 является дочерним для А1. 2) проверять в цикле паренты, начиная с парента для А2. искать вплоть до корня. по ресурсам - второй способ менее прожорлив. по скорости - зависит от количества элементов и количества уровней вложения. тут не угадаешь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2012, 08:33 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
Яростный Мечлучше циклом+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2012, 01:27 |
|
||
|
Рекурсия. Как правильно?
|
|||
|---|---|---|---|
|
#18+
enigmaticЯростный Мечлучше цикломeNose+1 простой перебор по парентам до искомого родителя / корня. и никаких рекурсий там ненадо в принципе.Всегда лучше или только в данном случае? всегда, когда потребление памяти - константа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2012, 01:29 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37822159&tid=1342237]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
186ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 559ms |

| 0 / 0 |
