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

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

14.11.2025, 16:48. Показов 2198. Ответов 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
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
23.11.2025, 12:53
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Это мои собственные строки
То есть тип "String" в этом коде - это не "System.String" из .Net ?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,806
Записей в блоге: 14
23.11.2025, 12:54  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть тип "String" в этом коде - это не "System.String" из .Net ?
Нет, иначе было бы с маленькой буквы. Это NStar.Core.String.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
23.11.2025, 13:01
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Нет, иначе было бы с маленькой буквы
Почему обязательно с маленькой?
string - это встроенный псевдонимом (alias) для класса System.String.
String и string - это тоже самое что Int32 и int.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,806
Записей в блоге: 14
23.11.2025, 13:04  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
String и string - это тоже самое что Int32 и int.
Это понятно, только вот именем String почти никто не пользуется, и даже сама Visual Studio при его использовании подсказывает, что "Имя может быть упрощено". Так же как и Int32.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 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
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,806
Записей в блоге: 14
23.11.2025, 13:19  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Почти все коллекции (в том числе и строки) это оболочки над массивами, в которых просто инкапсулировано пересоздание массивов.
Моя строка - это оболочка над указателями, в обход массивов, и эти указатели уничтожаются моментально, не дожидаясь, когда сработает сборщик мусора.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как минимум при работе с текстом надо учитывать особенности культуры в контексте которой этой текст интерпретируется.
В моем языке принудительно ставится InvariantCulture на уровне процесса. Могу также ставить в статическом конструкторе строки.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 2
23.11.2025, 13:29
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Моя строка - это оболочка над указателями, в обход массивов
Указатели на что?
Где-то же должна храниться коллекция исходных данных (символов) на что будут указывать эти указатели.
Сами указатели тоже где-то должны храниться.

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

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

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То есть вы игнорирует все языки кроме английского?
Даже сортировки нормальной, кроме английского, у вас не будет?
InvariantCulture - это всемирная культура, а не английский.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 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
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,806
Записей в блоге: 14
23.11.2025, 14:07  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В существующей компьютерной архитектуре, это просто сигнал для ОС, которая в будущем , возможно сдвинет память всех процессов. Соответсвенно, все фрагменты освобожденной памяти из всех процесов сместятся в один пул, который и будет присоединён к пулу свободной памяти для распределения по другим запросам.
Почему же тогда в стандартах многих языков является обязательным освободить память после использования, если это ничего не оптимизирует и все равно память не освобождается моментально? Что-то похоже на оксюморон...

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

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

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

Добавлено через 2 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
и еще, без указателей разве возможно получить диапазон (GetRange()) без пересоздания?
А зачем?
В самом простом случае.
Есть исходная строка текста. Передавайте начальный индекс и длину нужного фрагмента. Для синтаксического анализа этого "выше головы" хватит.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,806
Записей в блоге: 14
23.11.2025, 14:18  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Есть исходная строка текста. Передавайте начальный индекс и длину нужного фрагмента. Для синтаксического анализа это "выше головы".
Ну да, во все строки во всех функциях тащить начальный индекс и длину.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16152 / 11273 / 2890
Регистрация: 21.04.2018
Сообщений: 33,147
Записей в блоге: 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
151 / 135 / 29
Регистрация: 02.07.2013
Сообщений: 986
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
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru