Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14

Как быть, если образуется длинная максимально вложенная строка с рекурсивным вызовом?

14.11.2025, 16:48. Показов 2896. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MyClass
{
    Function F(longListOfParameters)
    {
        for (i)
        {
            for (j)
            {
                if (condition)
                {
                    return ... + F(longListOfParameters);
                }
                else if (condition2)
                {
                    return ... + F(longListOfParameters);
                }
                else
                    ...
            }
        }
    }
}
Рекомендации по стилю кода требуют: 1 - ограничить число отступов (у меня 5), 2 - ограничить длину строки (у меня 128), 3 - не использовать goto и другой спагетти-код. Если разбить longListOfParameters на части, я превышу число отступов. Если не разбивать, превышу длину строки. goto нельзя. Если вынести в подфункцию, будут сложные зависимости рекурсии, что тоже является спагетти-кодом. Что делать в такой ситуации, чтобы не нарушить стилевые правила?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.11.2025, 16:48
Ответы с готовыми решениями:

Получить новое число, которое образуется путем исключения средней цифры исходного числа
Дано натуральное число N. Если число содержит 5 цифр, то получить новое число М, которое образуется...

Последовательность чисел v0,v1,v2,. образуется по закону: v1=v2=0;
Доброго времени суток! Срочно нужна помощь! За ранее огромное спасибо!

С помощью рекурсивной функции выбирать подстроку, максимально вложенную в другие подстроки
С помощью рекурсивной функции выбирать подстроку, максимально вложенную в другие подстроки. Пример...

33
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.11.2025, 12:53
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Это мои собственные строки
То есть тип "String" в этом коде - это не "System.String" из .Net ?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
23.11.2025, 12:54  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть тип "String" в этом коде - это не "System.String" из .Net ?
Нет, иначе было бы с маленькой буквы. Это NStar.Core.String.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.11.2025, 13:01
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Нет, иначе было бы с маленькой буквы
Почему обязательно с маленькой?
string - это встроенный псевдонимом (alias) для класса System.String.
String и string - это тоже самое что Int32 и int.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
23.11.2025, 13:04  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
String и string - это тоже самое что Int32 и int.
Это понятно, только вот именем String почти никто не пользуется, и даже сама Visual Studio при его использовании подсказывает, что "Имя может быть упрощено". Так же как и Int32.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.11.2025, 13:17
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Это мои собственные строки, они изменяемы и могут добавить к себе символ или другую строку без пересоздания, так что эти операции быстрые.
Не хочу погружать в реализацию строк, но там очень много подводных камней.
Основные.
Массивы в существующей, актуальной компьютерной архитектуре являются по сути неизменяемыми. Почти все коллекции (в том числе и строки) это оболочки над массивами, в которых просто инкапсулировано пересоздание массивов. Оно там есть, но пользователь коллекции просто не видит за оболочкой как и когда это происходит.
Второе, строки (string) это не просто коллекция символов (char). В строках очень много логики связанной с тем что такой набор это не просто последовательность, а часть ТЕКСТА. Как минимум при работе с текстом надо учитывать особенности культуры в контексте которой этой текст интерпретируется.

Добавлено через 3 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Это понятно, только вот именем String почти никто не пользуется, и даже сама Visual Studio при его использовании подсказывает, что "Имя может быть упрощено". Так же как и Int32.
Но это всё равно жутко путает.
Я понял бы ещё введение типа с названием дефолтного типа, который используется редко и/или в самой .Net имеет несколько реализаций.
Но для основных типов (String, Int32, Double, Boolean и др.) я бы очень не советовал так делать.
Одно это уже будет отталкивать потенциальных пользователей от использования вашего пакета (платформы).

Добавлено через 2 минуты
Сам по себе аргумент Visual Studio при его использовании подсказывает не существенный.
Во первых, это не единственная IDE для работы с C#.
Во вторых, это настраиваемые правила, которые могут быть изменены пользователем VS.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
23.11.2025, 13:19  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Почти все коллекции (в том числе и строки) это оболочки над массивами, в которых просто инкапсулировано пересоздание массивов.
Моя строка - это оболочка над указателями, в обход массивов, и эти указатели уничтожаются моментально, не дожидаясь, когда сработает сборщик мусора.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как минимум при работе с текстом надо учитывать особенности культуры в контексте которой этой текст интерпретируется.
В моем языке принудительно ставится InvariantCulture на уровне процесса. Могу также ставить в статическом конструкторе строки.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.11.2025, 13:29
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Моя строка - это оболочка над указателями, в обход массивов
Указатели на что?
Где-то же должна храниться коллекция исходных данных (символов) на что будут указывать эти указатели.
Сами указатели тоже где-то должны храниться.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
эти указатели уничтожаются моментально, не дожидаясь, когда сработает сборщик мусора.
Ну, это возможно, только если вы их каким-то образом будете пихать в стек.
Такое вполне возможно, но такая реализация и имеет огромное количество минусов. Как-то ещё допустимых для небольших по размеру структур, но текстовые строки это явно не то что следует хранить в стеке.

Добавлено через 1 минуту
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
В моем языке принудительно ставится InvariantCulture на уровне процесса.
То есть вы игнорирует все языки кроме английского?
Даже сортировки нормальной, кроме английского, у вас не будет?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
23.11.2025, 13:31  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Указатели на что?
На char, разумеется.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ну, это возможно, только если вы их каким-то образом будете пихать в стек.
Никакого стека, простой FreeHGlobal().

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть вы игнорирует все языки кроме английского?
Даже сортировки нормальной, кроме английского, у вас не будет?
InvariantCulture - это всемирная культура, а не английский.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.11.2025, 13:50
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Никакого стека, простой FreeHGlobal().
И как это поможет хоть что-то оптимизировать?

В существующей компьютерной архитектуре, это просто сигнал для ОС, которая в будущем , возможно сдвинет память всех процессов. Соответсвенно, все фрагменты освобожденной памяти из всех процесов сместятся в один пул, который и будет присоединён к пулу свободной памяти для распределения по другим запросам.
Одной из задачей GС и является оптимизация всего этого. И как я вам писал ранее, GC делает это очень эффективно.

По сути, вы не делаете чего-то особенного в сравнении с T[] (в частностb char[]). Просто делаете это с огромными трудностями, массой дополнительного кода, возможными ошибками и менее эффективно.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
InvariantCulture - это всемирная культура, а не английский.
Но вы хоть чуток читайте прежде чем что-то использовать.
Свойство System.Globalization.CultureInfo.InvariantCulture
Если коротко, то на практике InvariantCulture - это "en-US" культура.

Добавлено через 3 минуты
То есть "международная культура" для американцев (а именно они разработчики этих стандартов внедрённых в Windows) - это их американская культура.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
23.11.2025, 14:07  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В существующей компьютерной архитектуре, это просто сигнал для ОС, которая в будущем , возможно сдвинет память всех процессов. Соответсвенно, все фрагменты освобожденной памяти из всех процесов сместятся в один пул, который и будет присоединён к пулу свободной памяти для распределения по другим запросам.
Почему же тогда в стандартах многих языков является обязательным освободить память после использования, если это ничего не оптимизирует и все равно память не освобождается моментально? Что-то похоже на оксюморон...

Добавлено через 10 минут
Элд Хасп, и еще, без указателей разве возможно получить диапазон (GetRange()) без пересоздания? Можно AsSpan(), но Span - специфическая структура, LINQ-подобные методы с ней не работают, либо нужно делать отдельные копии, кроме того, AsSpan() бессмысленен для структур в стиле связного списка или дерева. А на указательной арифметике это делается простым указанием начала и длины, разумеется, с проверкой, не случится ли выход за границу. А на массивах как?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.11.2025, 14:16
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Почему же тогда в стандартах многих языков является обязательным освободить память после использования, если это ничего не оптимизирует и все равно память не освобождается моментально? Что-то похоже на оксюморон...
Потому, что не на всех языках есть GC.

Память нужно освобождать, иначе как ОС узнает, что потом в будущем следует это место дефраментировать.
Но не следует ожидать, что это будет происходить мгновенно.
Как я вам ранее объяснял, такая дефрагментация это очень затратная операция. Она может затрагивать множество действующих процессов. Поэтому делать её "по каждому чиху" ОС точно не будет.
Возможно только в каких-то специализированных микроконтроллерах, в которых вопрос оптимизации памяти приоритетнее всех остальных. Но очень сомневаюсь, что на таких системах будет использоваться Шарп.

В Шарпе же все это берёт на себя GC. Заменять его чем-то кастомным и надеяться что это будет работать эффективнее... скажем так - наивно.

Добавлено через 2 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
и еще, без указателей разве возможно получить диапазон (GetRange()) без пересоздания?
А зачем?
В самом простом случае.
Есть исходная строка текста. Передавайте начальный индекс и длину нужного фрагмента. Для синтаксического анализа этого "выше головы" хватит.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,852
Записей в блоге: 14
23.11.2025, 14:18  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Есть исходная строка текста. Передавайте начальный индекс и длину нужного фрагмента. Для синтаксического анализа это "выше головы".
Ну да, во все строки во всех функциях тащить начальный индекс и длину.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.11.2025, 16:37
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Ну да, во все строки во всех функциях тащить начальный индекс и длину.
Пример реализации, накиданный сейчас "на коленке":
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
    public partial class SubString : IEnumerable<char>
    {
        private readonly string original;
        private readonly int begin;
        private readonly int length;
 
        public SubString(string original, int begin, int length)
        {
            ArgumentNullException.ThrowIfNull(original);
 
            ArgumentOutOfRangeException.ThrowIfNegative(begin);
            ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(begin, original.Length);
 
            ArgumentOutOfRangeException.ThrowIfNegative(length);
            ArgumentOutOfRangeException.ThrowIfGreaterThan(begin + length, original.Length, nameof(length));
 
 
            this.original = original;
            this.begin = begin;
            this.length = length;
        }
 
        public IEnumerator<char> GetEnumerator()
        {
            int end = begin + length;
            for (var i = begin; i < end; i++)
                yield return original[i];
        }
 
        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }
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
    public partial class SubString : IReadOnlyList<char>
    {
        public char this[int index]
        {
            get
            {
                ArgumentOutOfRangeException.ThrowIfNegative(index);
                ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, length);
 
                return original[begin + index];
            }
        }
 
        public int Count => length;
 
        public SubString GetRange(int begin, int length)
        {
            ArgumentOutOfRangeException.ThrowIfNegative(begin);
            ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(begin, this.length);
 
            ArgumentOutOfRangeException.ThrowIfNegative(length);
            ArgumentOutOfRangeException.ThrowIfGreaterThan(begin + length, this.length, nameof(length));
 
 
            return new SubString(original, this.begin + begin, length);
        }
    }
1
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
02.12.2025, 15:04
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ну, это возможно, только если вы их каким-то образом будете пихать в стек.

Не по теме:

Замечу что еще можно самостоятельно какой-то аллокатор написать и жить в рамках заранее выделенной памяти и костылить работу над строками каким-то необычным способом, но тут (имхо) шарп будет скорее не помощником а помехой

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2025, 15:04

Сколько может быть вложенных скобок в if()
Сколько может быть вложенных скобок в if () У меня вот такая вот шляпа : if ((doparr == 42)...

Binding к вложенным свойствам (ко свойству базового класса), ошибка: "Ключ не может быть неопределенным. Имя параметра: key"
Здравствуйте, есть базовый класс, от которого унаследованы 2 других, и в базовом есть 1 свойство ,...

Рекурсивный запрос: узнать ID всех вложенных level
Есть 2 таблицы. В 1 таблице есть столбец StartLevel. Во 2 таблице есть столбцы ParentLevel i...

Для указанной директории произвести рекурсивный перебор всех вложенных поддиректорий и файлов
Здравствуйте. Нужен совет по одному заданию. &quot;Необходимо для указанной директории произвести...

Как быть с чересчур длинными названиями кнопок?
Хочется чтобы все кнопки были одного размера. Так как то красивее... Но вот одна кнопка уж очень...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru