Имя: Пароль:
1C
1С v8
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) В функции ошибка. Если в конце нет точки, совсем нет, то вообще вернет Пустоту.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.