Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1516 / 1081 / 151
Регистрация: 23.07.2010
Сообщений: 5,963
1

Оправдана ли в данном случае рекурсия?

24.10.2013, 11:12. Показов 515. Ответов 4
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
  private TreeNode FindRoot(TreeNode Node)
        {
            if ((Node.Parent)==null)
                return Node;
            else
                return FindRoot(Node.Parent);
        }
Если уровней вложенности не более трех?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2013, 11:12
Ответы с готовыми решениями:

Что означает %k в данном случае?
#include <iostream> #include <conio.h> using namespace std; void main() { int i,j,k;...

что означает %k в данном случае?
#include <iostream> #include <conio.h> using namespace std; void main() { int i,j,k;...

Освобождаются ли ресурсы в данном случае
в событии нажатия кнопки из главной формы создается child форма так: yesNo wDialog = new...

Как улучшить ПК в данном случае?
Всем привет! Подскажите, пожалуйста: "Что в моём ПК на данный момент является слабым звеном -...

4
706 / 706 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
24.10.2013, 12:38 2
pincet, здравствуйте, вполне.
Вот маленький тест:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Program
{
    static void Main()
    {
        int nodesCount = 100;
        Node[] nodes = Enumerable.Range(0, nodesCount).Select(x=>new Node() { num = x }).ToArray();
        for (int i = 1; i < nodes.Length; i++)
            nodes[i].parent = nodes[i - 1];
            
        Stopwatch sw = new Stopwatch();
        sw.Start();
        Console.WriteLine("Parent {0} time {1}", FindRootRecursion(nodes[nodes.Length - 1]), sw.Elapsed);
        sw.Stop();
        sw.Start();
        Console.WriteLine("Parent {0} time {1}", FindRootLoop(nodes[nodes.Length - 1]), sw.Elapsed);
        sw.Stop();
    }
 
    class Node
    {
        public int num;
        public Node parent;
 
        public override string ToString()
        {
            return num.ToString();
        }
    }
 
    static Node FindRootRecursion(Node node)
    {
        if (node.parent == null)
            return node;
        else
            return FindRootRecursion(node.parent);
    }
 
    static Node FindRootLoop(Node node)
    {
        Node tmp = node;
        while (tmp.parent != null)
            tmp = tmp.parent;
        return tmp;
    }
}
1
1516 / 1081 / 151
Регистрация: 23.07.2010
Сообщений: 5,963
24.10.2013, 13:19  [ТС] 3
Забавно, но я немного не то имел ввиду.
При трех (не более) уровнях вложенности не выгоднее ли проверить уровень узла и в зависимости от него либо
C#
1
2
3
Node.Parent
//либо
Node.Parent.Parent
Как-то индусским кодом попахивает, не?
0
706 / 706 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
24.10.2013, 13:32 4
Даже при таком раскладе рекурсия оказывается быстрее, тем более что в таком виде метод способен обрабатывать и бОльшую вложенность.
0
605 / 580 / 157
Регистрация: 29.06.2010
Сообщений: 1,611
24.10.2013, 14:06 5
pincet, можно ещё создать собственный класс Node, с блекджеком и шлюхами со свойством Root, которому будет присваиваться значение в конструкторе (но тогда в конструктор необходимо будет добавить параметр ParentNode. Соответственно если ParentNode==null - то Root=this;
хотя проще оставить рекурсию))
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2013, 14:06

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как применить в данном случае Switch
Вот код: var overworks = document.querySelectorAll('.overwork'); for (var i = 0; i &lt;...

Что делает в данном случае foreach?
Помогите, пожалуйста, разобраться, что в данном случае делает foreach, так как разницы между вторым...

Как организовать цикл в данном случае?
Доброй ночи. Вопрос таков -- на вход подаются два массива. В одном просто 60 элементов-чисел...

какую видяху поставить в данном случае?
подскажите какую видяху сюда можно вставить по цене до 4500 р. сам я думаю Palit PCIe-16x 512Mb...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.