![]() |
![]() |
![]() |
|
Как правильно сделать рекурсию? | ☑ | ||
---|---|---|---|---|
0
breezee
30.11.15
✎
17:05
|
Нужно чтобы в коде ниже после каждого прохода обновлялся массив стркутур. А то он каждый раз проходит по старым данным.
Подскажите, пожалуйста, как это сделать? МассивВнутриСкобья = ПолучитьМассивВнутрискобья(МояСтрока); Для Каждого Диапазон из ПолучитьМассивВнутрискобья(МояСтрока) цикл Если Диапазон.Начало <> Неопределено Тогда ЧислоСимволов = Диапазон.Конец - Диапазон.Начало+1; ЧислоСимволовДоНачала = Диапазон.Начало - 3; СтрокаЗамены = Сред(МояСтрока,Диапазон.Начало, ЧислоСимволов); МояСтрока = Сред(МояСтрока,1,ЧислоСимволовДоНачала) + СтрокаЗамены + Сред(МояСтрока,Диапазон.Конец+2); МассивВнутриСкобья = ПолучитьМассивВнутрискобья(МояСтрока); КонецЕсли; КонецЦикла; |
|||
1
Cyberhawk
30.11.15
✎
17:10
|
На картинке код покажи
|
|||
2
ejikbeznojek
30.11.15
✎
17:11
|
Ну если бы это был не массив а выборка, тогда можно было бы использовать следующий()
А так на ум сходу приходит только счётчик какой-нибудь.. А это у тебя точно рекурсия? |
|||
3
breezee
30.11.15
✎
17:14
|
(1) Не знаю куда заливать. Залил сюда
http://rghost.ru/6KvryxmW9 (2) Не да. удаляю элементы из строки, потом нахожу элементы на удаления из получившейся строки и так же их удаляю |
|||
4
breezee
30.11.15
✎
17:14
|
(3) Ничерта не видно, сейчас найу куда залить
|
|||
5
breezee
30.11.15
✎
17:16
|
||||
6
Cyberhawk
30.11.15
✎
17:16
|
"Для Каждого Диапазон из ПолучитьМассивВнутрискобья(МояСтрока) цикл " // тебе точно надо на каждой итерации вызывать эту функцию и обрабатывать первый элемент коллекции?
|
|||
7
Garykom
гуру
30.11.15
✎
17:18
|
(0) мда
|
|||
8
breezee
30.11.15
✎
17:20
|
(6) Блин, понял что не надо. Массив заново нужно получать, только если строка изменилась. хотя один хрен не работает
Для Каждого Диапазон из МассивВнутриСкобья цикл Если Диапазон.Начало <> Неопределено Тогда ЧислоСимволов = Диапазон.Конец - Диапазон.Начало+1; ЧислоСимволовДоНачала = Диапазон.Начало - 3; СтрокаЗамены = Сред(МояСтрока,Диапазон.Начало, ЧислоСимволов); МояСтрока = Сред(МояСтрока,1,ЧислоСимволовДоНачала) + СтрокаЗамены + Сред(МояСтрока,Диапазон.Конец+2); МассивВнутриСкобья = ПолучитьМассивВнутрискобья(МояСтрока); КонецЕсли; КонецЦикла; |
|||
9
ejikbeznojek
30.11.15
✎
17:22
|
Чёт я не пойму что этот код делает...
Ищет номера символов где есть открывающие скобки и закрывающие? И потом заменяет все "+" внутри скобок минусами? а "-" плюсами?) |
|||
10
Garykom
гуру
30.11.15
✎
17:22
|
(7)+
ЗЫ когда закончится цикл? |
|||
11
ejikbeznojek
30.11.15
✎
17:23
|
Ты бы лучше написал, пример входящей строчки и что должно быть на выходе))
|
|||
12
breezee
30.11.15
✎
17:26
|
(9) Да, а после раскрытия скобок сами скобки я должен удалить. (10) Ну на 4 проходе же. Получаем строку 1 раз. Я так понял у меня так же. Как тогда чертову рекурсию запхнуть? (11) входящая -(1+2)-(2+3) на выходе 1-22-3. Хотя бы так. В идеале конечно -1-2-2-3
|
|||
13
Garykom
гуру
30.11.15
✎
17:29
|
(12) "(10) Ну на 4 проходе же." - ???
|
|||
14
breezee
30.11.15
✎
17:31
|
(13) Цикл (10) закончится на 4 проходе. Специально проверил.
|
|||
15
Cyberhawk
30.11.15
✎
17:31
|
Пишешь синтаксический анализатор (калькулятор?) на 1С, в универе учишься что ли?
|
|||
16
breezee
30.11.15
✎
17:33
|
(15) Неа. Стажируюсь. Мне сказали писать запросы. Запросы вида СНК_50+СНК_60 или -(СНК_50+СНК_60), где снк - сальдо начальное кредитовое там конечно много сложных запросов, но хотел бы автоматизировать написание простых запросов.
|
|||
17
Garykom
гуру
30.11.15
✎
17:36
|
(14) да это фича платформы, но так все равно неправильно, тем более у тебя не "цикл со счетчиком" а "перебор коллекции"
|
|||
18
ejikbeznojek
30.11.15
✎
17:44
|
НоваяСтрока="";
КусокНовойСтроки=""; СтараяСтрока="-(1+2)-(2+3)"; Пока СтрДлинна(СтараяСтрока)>0 Цикл СкобкаОткр = Найти(СтараяСтрока,"("); если СкобкаОткр>1 тогда ВдругМинус=сред(СтараяСтрока,СкобкаОткр-1,1); если ВдругМинус = "-" тогда ЕстьМинус=истина; иначе ЕстьМинус=Ложь; КонецЕсли; Сч=СкобкаОткр; Пока ТекСимвол <> ")" цикл ТекСимвол=Сред(СтараяСтрока,сч,1); Если ТекСимвол="+" или ТекСимвол="(" и ЕстьМинус тогда ТекСимвол="-"; ИначеЕсли ТекСимвол ="-" и ЕстьМинус тогда ТекСимвол="+"; КонецЕсли НоваяСтрока=НоваяСтрока+ТекСимвол; Сч=Сч+1; если Сч>=СтрДлина(СтараяСтрока) тогда прервать; конецесли конеццикла СтараяСтрока=сред(СтараяСтрока,СтрДлина(НоваяСтрока+1),СтрДлина(Строка)); КонецЦикла; Что-нибудь в этом роде мб сделать? Только мог ошибиться в длинах строк или ещё какой фигне) |
|||
19
breezee
30.11.15
✎
17:45
|
Ок, я выкрутился(код ниже). Однако если мне вдруг понадобиться динамически обновлять массив - это не получится?
МассивВнутриСкобья = ПолучитьМассивВнутрискобья(МояСтрока); РезультирующаяСтрока = ""; Для Каждого Диапазон из МассивВнутриСкобья цикл Если Диапазон.Начало <> Неопределено Тогда ЧислоСимволов = Диапазон.Конец - Диапазон.Начало+1; СтрокаЗамены = Сред(МояСтрока,Диапазон.Начало, ЧислоСимволов); СтрокаЗамены = СтрЗаменить(СтрокаЗамены,"+","плюс"); СтрокаЗамены = СтрЗаменить(СтрокаЗамены,"-","+"); СтрокаЗамены = СтрЗаменить(СтрокаЗамены,"плюс","-"); МояСтрока = Сред(МояСтрока,1,Диапазон.Начало-1) + СтрокаЗамены + Сред(МояСтрока,Диапазон.Конец+1); РезультирующаяСтрока = РезультирующаяСтрока + СтрокаЗамены; КонецЕсли; КонецЦикла; Возврат РезультирующаяСтрока; (18) Спасибо! Сейчас посмотрю |
|||
20
breezee
30.11.15
✎
17:48
|
(18) Спасибо, идею понял. Почерпнул идею проверку на "-" если "("
|
|||
21
ejikbeznojek
30.11.15
✎
17:50
|
Ну просто отрезай куски от старой строки формируя новую
посимвольно В идеале цикл закончится когда старая строка станет = "" Массивы тут пожалуй не очень нужны |
|||
22
Garykom
гуру
30.11.15
✎
17:52
|
||||
23
Garykom
гуру
30.11.15
✎
17:53
|
(22)+ это к тому что и без рекурсии можно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |