powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сделать дерево плоским списком
13 сообщений из 38, страница 2 из 2
Сделать дерево плоским списком
    #39696249
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Визитор и рекурсия, близнецы-братья
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39696279
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВизитор и рекурсия, близнецы-братья

Ниче подобного )
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39696355
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВВизитор и рекурсия, близнецы-братья

Ниче подобного )
Если решаем проблему двойной диспетчеризации, то да, нет рекурсии.
А если нужно все же обойти дерево, то вот она родненькая!
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39696362
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВ,

Так в этом и смысл. При добавлении класса, его нужно добавить в интерфейс посетителя, что неумолимо приведёт к необходимости написать реализацию. К сожалению, функциональщики этого факта не понимают, по этому со своим аргументом "код в три строки" идут лесом :)

Визитор может обойти иерархию и сделать что-нибудь, нахаляву получишь сформированный плоский список.
Не понимаю, что ты наехал на функциональщиков, но современные функциональные языки легко сводят рекурсию к циклам, если это возможно, сохраняя при этом "код в три строки".
Вот пример, это после компиляции превращается в (на c#).
Код: 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.
public static int findTree(FSharpFunc cont, int find, FSharpList t)
{

	while (true)
	{
		FSharpList val = t;
		if ((int)val.get_TailOrNull() == 0)
		{
			return (int)cont.Invoke((!0)null);
		}
		FSharpList val2 = val;
		FSharpList t2 = val2.get_TailOrNull();
		Tree<int> h = (Tree<int>)val2.get_HeadOrDefault();
		Tree<int> tree = h;
		int value = tree.item.Item2;
		FSharpList child = tree.item.Item1;
		if (value != find)
		{
			findTree@28 findTree@ = new findTree@28(cont, find, child);
			int num = find;
			t = t2;
			find = num;
			cont = findTree@;
			continue;
		}
		break;
	}
	return 1;
}
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39696740
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВНе понимаю, что ты наехал на функциональщиков, но современные функциональные языки легко сводят рекурсию к циклам, если это возможно, сохраняя при этом "код в три строки".

Наезд на функциональщиков здесь не относится к циклам, а к необходимости писать реализации при развитии иерархии классов. Функциональщики просто будут тупо ловить исключения и ошибки отсутствия ошибки обработки новых типов, и никто им тут не поможет. Стандартный посетитель обязывает на уровне компиляции. Да, больше строк кода, но гарантии, сэр. Гарантии.


ЕвгенийВВот пример, это после компиляции превращается в (на c#).


Ну блин. Компилятор в состоянии разворачивать хвостовые рекурсии и в C#, и даже на C++.
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39696741
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЕсли решаем проблему двойной диспетчеризации, то да, нет рекурсии.
А если нужно все же обойти дерево, то вот она родненькая!

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

Отсюда, как я и сказал, по возможности рекурсии надо избегать. Концепция красивая, да. Но нафиг она не нужна, даже если кажется, что ну здесь же не может быть большой глубины. Может.
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39696748
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ...современные функциональные языки легко сводят хвостовую рекурсию к циклам, если это возможно, сохраняя при этом "код в три строки".
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39697046
Ermak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсть класс, хранящий дерево элементов. Дочерние элементы хранятся в поле списка List<BaseTreeData> Child. Хочу вывести это дерево как "плоский" (линейный) список всех элементов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class BaseTreeData
    {
        public bool IsChecked { get; set; }
        public BaseTreeData Parent { get; set; }
        public List<BaseTreeData> Child { get; set; }

        public BaseTreeData()
        {
            Child = new List<BaseTreeData>();
        }
    }



Я деревья по другому рисую
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class BaseTreeData
    {
        public int Id {get; set;}
        public int? ParentId {get; set;}
        public bool IsChecked { get; set; }

        public BaseTreeData() {
           IsChecked = false;
        }
    }
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39697086
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79, hVostt

Продемонстрируйте пожалуйста оптимизацию хвостовой рекурсии в C#?
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39697105
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

Компилируй в x64, получишь свою оптимизацию.
Компилируй в x86 (AnyCPU), получишь кукиш :)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine(Ping(int.MaxValue, 0));
            Console.ReadLine();
        }

        public static long Ping(int cnt, long val)
        {
            if (cnt-- == 0) return val;
            return Ping(cnt, val + 1);
        }
    }
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39697132
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
Нифига
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39697182
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVostt,
Нифига

Чё нифига? У меня этот код, под x32 падает с StackOverflowException, под x64 отлично работает.
...
Рейтинг: 0 / 0
Сделать дерево плоским списком
    #39697196
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
на x64 стек больше.
если не сложно кинь сборку на мыло в профиле?
дизассеблирую и посмотрю...
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сделать дерево плоским списком
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]