| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > получения всех предков записи в дереве |
| Автор: gribikc 23.5.2008, 18:43 | ||
как при такой структуре записи получь для произвольного id всех предков(ну тоеть id предков) |
| Автор: skyboy 23.5.2008, 23:27 |
| рекурсивно. |
| Автор: gribikc 25.5.2008, 13:22 | ||||
я так и сделал но при этом мне необходимо в рекурсивной функции каждый раз вызывать другую рекурсивную функцию не слишком ли это тупо получается собственно я думал может ктонить чтото интересненькое предложит... вот весь скрипт
он ещё не до конца верно работает |
| Автор: Feldmarschall 25.5.2008, 13:36 |
| для получения предков рекурсия не нужна |
| Автор: skyboy 25.5.2008, 14:02 |
для получения непосредственных предков. так? а мои телепатические способности утверждают, что топикстартеру нужно то, чем хвалится nested sets - быстро получить всех предков узла до N-го колена. впрочем, телепатические способности могут и ошибаться... |
| Автор: Feldmarschall 25.5.2008, 14:04 |
| а какие бывают ещё, кроме непосредственных? Вообще, насколько я понимаю, рекурсия бывает нужна только при движении вниз. при движении вверх, или по горизонтали, она ведь не нужна. или я ошибаюсь? |
| Автор: gribikc 25.5.2008, 14:17 | ||
| вообщем не буду мочить вот рабочий скрипт http://gribikc.ru/tree/tree.php вот его код
вопрос можно ли проще сделать чем через вложенную рекурсию skyboy, необходимо получать всех предков до начальной записи Feldmarschall, а как тогда??? |
| Автор: Feldmarschall 25.5.2008, 14:24 |
| так же, как и любые другие операции в программировании - созданием слгоритма! ты можешь написать код, который получит одного предка? непосредственного предка? а для полученного предка получить его предка? а посмотреть на полученный код, и подумать, как его можно оптимизировать? |
| Автор: gribikc 25.5.2008, 14:26 |
| Feldmarschall, к сажелению всё что смог оптимизировать это я вылож пока новых мыслей нет в любом случае если не рекурсия то цикл будет |
| Автор: Feldmarschall 25.5.2008, 14:41 |
| не понял смысла этого "в любом случае". а ты как хотел? чтобы вообще без единого оператора, все само построилось? ну раз ты понимаешь, как сделать циклом - почему не сделаешь? |
| Автор: Mushu 25.5.2008, 15:06 | ||||||||
есть рекурсии как и по низ ходящим это от родителя до чилдрена, так и восходящим тобишь от детей к родителю Добавлено @ 15:07
Через рекурсию самый быстрый способ.
|
| Автор: Feldmarschall 25.5.2008, 15:12 |
| skyboy, нет, я не понял, почему при движении вверх (а вот интересно, почему я говорю "вверх", имея в виду корень дерева?) адекватной будет рекурсия, а не цикл. Цикл проще, с точки зрения алгоритма, реализации и понимания. Я считаю, что рекурсия не должна быть синонимом слова "дерево", и применяться для любой задачи, с ним связанной, на автомате. Добавлено через 40 секунд Батюшки =) Специалист подтянулся =)))) |
| Автор: skyboy 25.5.2008, 15:26 | ||||
небось, на бумаге рисовал от корня и сверху-вниз. так?
согласен. построение древовидной структуры и быстрее, и нагляднее - итеративно. за N действий. но обход - почему бы и нет? вообще говоря, вопрос простоты понимания - довольно субъективная вещь. мне чаще проще написать рекурсивную функцию, тогда как в циклах не всегда обойтись без дополнительных ветвлений и всяких булевских флагов. В отдельной функции оно, по крайней мере, смотрися "прозрачнее". впрочем, это слишком близко к вопросу религии |
| Автор: gribikc 25.5.2008, 15:27 |
| Feldmarschall, в данном случаее рекурсией сдесь наглядней чем циклом но меня интересует как ещё это можно сделать??? |
| Автор: skyboy 25.5.2008, 15:31 | ||
"пройтись" по (не)ограниченной вложенности структуре возможно двумя способами: - итеративно - рекурсивно варианты приводимы друг к другу, т.е. нет ситуации, когда одно использовать возможно, а второе - нет. другой вопрос, что при одном алгоритме короче/читаемее рекурсивный вариант, а в другом случае - итерация будет верхом изящества. смотри сам, по ситуации. Добавлено через 2 минуты и 13 секунд
дело в том, что как раз вызов из функции самой себя - это и есть рекурсия. не будет "самовызова" - это уже не рекурсия будет. и вот ещё: нет, само по себе это не тупо. |
| Автор: Feldmarschall 25.5.2008, 15:34 | ||||
мы говорим не об абстрактных циклах, а о конкретной задаче - получить родителей по цепочке. здесь задача, скорее, на понимание своих действий. если человек представляет себе дерево, то цикл - наиболее естественный вариант решения. что может быть проще, чем запросить в цикле у БД несколько записей? если дерево для человека - тёмный лес, и есть только шаблон "дерево=рекурсия", то да - проще рекурсией. здесь задача, скорее, на умение алгоритмизировать свои действия. что такое цикл? когда мы его применяем? когда видим несколько одинаковых действий. ведь прекрасно будет работать программа, к примеру, такая:
но программист видит повторяемость операторов, и делает на этом месте цикл. то же самое и с получением предков. |
| Автор: gribikc 25.5.2008, 15:39 |
| skyboy, нет ты не понел мы в одной рекурсивной функции вызываем другую рекурсивную функцию вот о чём была речь.- итеративно-что ты под этим понимаешь?? Feldmarschall, я не щитаю множественные запросы к базе данных удачным решением(об этом даже хостер просит чтоб так не делали) |
| Автор: Feldmarschall 25.5.2008, 15:58 |
| Хостер твой дурак. Дело не в количестве запросов, а в качестве. Выборка по первичному ключу ВООБЩЕ никак не напрягает базу. Хоть сто записей выбирай, а не 2-3, как у тебя. Но речь вообще не о БД. БД я привел для примера. Если у тебя все лежит в массиве, то для него задачу тоже можно решить. Для этого надо думать над структурой массива. |
| Автор: gribikc 25.5.2008, 15:59 |
| Feldmarschall, ну как разтаки над структурой массива я всё продумал их там из одного запроса составляется 2 для дерева и для предков соответственно |