|
8.3 Возврат из значения рекурсивной функции | ☑ | ||
---|---|---|---|---|
0
breezee
19.02.16
✎
12:15
|
Убираю последние точки, код ниже. При выполнении функции у меня поле всех вызовов не возвращает значение моей строки, а заново вызывается строка помеченная (***) и не возвращает ничего. Я сделал эту функцию по-другом, без рекурсии, но, если мне вдруг понадобится возвращать значения в рекурсивной функции - мне это может понадобится. Подскажите, пожалуйста, где я не правильно организовал рекурсию?
стр1 = ""; Стр = "128.21.12..."; стр1 = УбратьПоследниеТочки(Стр); Стр = "128.21.12."; стр1 = УбратьПоследниеТочки(Стр); Стр = "128.21.12.."; стр1 = УбратьПоследниеТочки(Стр); Функция УбратьПоследниеТочки(Стр) ПоследнийСимвол = Сред(Стр,СтрДлина(Стр),1); Если ПоследнийСимвол = "." Тогда НоваяСтрока = Сред(Стр,1,СтрДлина(Стр)-1); (***) НоваяСтрока = УбратьПоследниеТочки(НоваяСтрока); КонецЕсли; Возврат НоваяСтрока; КонецФункции |
|||
1
эксвилл
19.02.16
✎
12:21
|
(0) Что вернет твоя функция, если на входе будет строка без точек?
|
|||
2
pessok
19.02.16
✎
12:24
|
лучше бы сделать это процедурой, без переменной НоваяСтрока
Процедура УбратьПоследниеТочки(Стр) ПоследнийСимвол = Сред(Стр,СтрДлина(Стр),1); Если ПоследнийСимвол = "." Тогда Стр = Сред(Стр,1,СтрДлина(Стр)-1); УбратьПоследниеТочки(НоваяСтрока); КонецЕсли; КонецПроцедуры |
|||
3
breezee
19.02.16
✎
12:27
|
(1) Не отработал это, извиняюсь. Все равно пример тестовый (2) Мне в конкретной задаче нужно было возвращать значение. Для всех строк колонки из экселя я получаю строки, потом обрезаю все последние точки и записываю обратно в эксель
|
|||
4
sonne666
19.02.16
✎
12:28
|
(0) вместо НоваяСтрока используй Стр, или переопределяй НоваяСтрока = Стр.
Сейчас функция вернет пустую строку, если в переданной строке нет последней точки. |
|||
5
Mort
19.02.16
✎
12:29
|
К рекурсии нужно относиться как к неизбежному злу.
А эта задача запросто решается одним циклом. |
|||
6
Рэйв
19.02.16
✎
12:30
|
Для н=1 По СтрДлина(Чтото) Цикл
Если Прав(Чтото,1)="." Тогдам Чтото=Лев(Чтото,СтрДлина(Чтото)-1); КонецЕсли; КонецЦикла; |
|||
7
Лефмихалыч
19.02.16
✎
12:34
|
everybody stand back!
Функция УдалитьТочкиВКонце(Строка) RE = New COMObject("VBScript.RegExp"); RE.Global = Истина; RE.IgnoreCase = Истина; RE.Multiline = Истина; RE.Pattern = ".+$"; Возврат RE.Replace(Строка, ""); КонецФункции |
|||
8
ObjectRelation Model
19.02.16
✎
12:35
|
Функция УбратьПоследниеТочки(Знач Стр)
ПоследнийСимвол = Сред(Стр,СтрДлина(Стр),1); Если ПоследнийСимвол = "." Тогда Стр = Сред(Стр,1,СтрДлина(Стр)-1); Стр = УбратьПоследниеТочки(Стр); КонецЕсли; Возврат Стр; КонецФункции |
|||
9
Лефмихалыч
19.02.16
✎
12:35
|
только там ".$", а не ".+$"
Это важно. При копипасте потерялось. |
|||
10
Mort
19.02.16
✎
12:38
|
(9) Добро пожаловать в унылый мир кроссплатформенных приложений.
|
|||
11
Лодырь
19.02.16
✎
12:42
|
(8) будь в тренде ) открой для себя СтрЗаканчиваетсяНа(<Строка>, <СтрокаПоиска>)
Пока СтрЗаканчиваетсяНа(Стр,".") Цикл Стр = Лев(Стр,СтрДлина(Стр)); КонецЦикла; |
|||
12
pessok
19.02.16
✎
12:44
|
(11) воу. надо иногда читать не только про баги в новых версиях платформы
|
|||
13
Лефмихалыч
19.02.16
✎
12:46
|
+(7)
Функция УдалитьТочкиВКонцеТупоЦиклом(Знач Строка) Длина = СтрДлина(Строка); Для СчЦ=1 по Длина Цикл Если Сред(Строка, Длина-СчЦ+1, 1)<>"." Тогда Строка = Лев(Строка, Длина-СчЦ+1); прервать; КонецЕсли; КонецЦикла; Возврат Стркоа; КонецФункции Функция УдалитьТочкиРекурсивно(Строка) Если ПустаяСтрока(Строка) Тогда Возврат ""; ИначеЕсли Прав(Строка, 1) = "." Тогда Строка = УдалитьТочкиРекурсивно(Сред(Строка, 1,СтрДлина(Строка)-1)); КонецЕсли; Возврат Строка; КонецФункции (11) это чит для слабаков |
|||
14
фобка
19.02.16
✎
12:47
|
(11) бесконечный цикл
|
|||
15
Лефмихалыч
19.02.16
✎
12:47
|
В рекурсивной Сред на Лев можно заменить, короче получится на три символа
|
|||
16
Лодырь
19.02.16
✎
12:49
|
(15) А если перейти на английское написание функций, то будет еще короче?
|
|||
17
pessok
19.02.16
✎
12:57
|
(14) ну дат, там у него должно быть СтрДлина(Стр)-1
|
|||
18
Лодырь
19.02.16
✎
13:04
|
(17) (14)
таки да. -1. не суть важно ) Но вы задумайтесь, даст ли плюс переход на английский язык. И удаление переносов строк. Меньше текста - меньше вес конфы, улучшается быстродействие ) |
|||
19
фобка
20.02.16
✎
10:58
|
(18) по-моему вес конфы увеличивается блоками.. Там не прямая зависимость от количества символов. Создай внешнюю обработку с процедурой, сохрани, посмотри размер. Добавь в обработку комментарий, сохрани, сравни
|
|||
20
фобка
20.02.16
✎
10:59
|
Тем более код компилируется, поэтому язык не влияет на скорость. Только читаемость
|
|||
21
Ildarovich
20.02.16
✎
14:20
|
Это задача вообще одним выражением решается. Если в строке нет пробелов, то
Ответ = СтрЗаменить(СокрП(СтрЗаменить(Дано, ".", " ")), " ", ".") Если в строке есть пробелы, то понадобится еще две СтрЗаменить. |
|||
22
Mr_Rm
24.02.16
✎
12:01
|
(7) Надо
RE.Pattern = "\.+$"; иначе обнулит всю строку. |
|||
23
ЧеловекДуши
24.02.16
✎
12:04
|
(0) В функции ошибка. Если в конце нет точки, совсем нет, то вообще вернет Пустоту.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |