Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
17 июн 2024, 05:10

Помогите довести код до ума новичку

Автор OnePunch-Man, 23 мар 2023, 04:09

0 Пользователей и 1 гость просматривают эту тему.

OnePunch-Man

Помогите разобраться с задачей принцып действий понимаю, а как привести код к нужному виду не совсем.

Даны два целых числа A и В. Выведите все числа от A до B включительно, в порядке возрастания через запятую, если A < B, но если A > B тогда выводить в порядке убывания через запятую. Выполнить используя серверный вызов.
Вывод информации должен быть осуществлен на клиенте.
Нельзя использовать циклы. Нужно использовать рекурсию.

Примерный результат:

1 случай:
Сообщения:
20,21,22,23,24,25,26,27,28,29,30,....,40

2 случай:
Сообщения:
30,29,28,27,26,25,24,23,23,22,21,20

Сейчас написал такой код, подскажите пожалуйста что нужно доработать

&НаКлиенте
Процедура Команда1(Команда)

Число1 = 20;
Число2 = 40;
Результат = "";
ВыводЗначенияНаСервере(Число1, Число2,Результат);
Сообщить(Результат);

КонецПроцедуры


&НаСервере
Функция ВыводЗначенияНаСервере(Число1, Число2,Результат)

Если Число1 > Число2 Тогда
Возврат 0;
Иначе
Отсчет = Число1 + 1;
Возврат Отсчет;
КонецЕсли;


КонецФункции






Kvark5d

OnePunch-Man, попробуй так:
Функция ВыводЗначенияНаСервере(Знач Число1,Знач Число2,Результат)
   Если Число1<Число2 Тогда
      Результат=Результат+строка(Число1)+",";
      Число1=Число1+1;
      ВыводЗначенияНаСервере(Число1,Число2,результат);
   ИначеЕсли Число2<Число1 Тогда
      Результат=Результат+строка(Число1)+",";
      Число1=Число1-1;
      ВыводЗначенияНаСервере(Число1,Число2,результат);
   ИначеЕсли Число1=Число2 Тогда
      Результат=Результат+строка(Число1);
      возврат результат;   
   КонецЕсли;       
КонецФункции

LexaK

OnePunch-Man, если у вас версия платформы > 8.3.6
попробуйте такой код (не проверял, могут быть опечатки)
&НаКлиенте
Процедура Команда1(Команда)
   
    Число1 = 20;
    Число2 = 40;
    Результат = Новый Массив;
    ВыводЗначенияНаСервере(Число1, Число2,Результат);
    Сообщить(СтрСоединить(Результат,","));     
   
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыводЗначенияНаСервере(Число1, Число2,Результат)
   
    Если Число1 < Число2 Тогда
        лкШаг = 1;
    ИначеЕсли Число1 > Число2 Тогда
        лкШаг = -1;
    Иначе
        //числа равны, завершаем рекурсию
        Результат.Добавить(Число1);
        Возврат;
    КонецЕсли;
    Результат.Добавить(Число1);
    Число1 = Число1 + лкШаг;                           
    //вызов самой себя - вот она рекурсия!
    ВыводЗначенияНаСервере(Число1, Число2,Результат);
       
КонецПроцедуры


если помогло нажмите: Спасибо!

nvj84

Вариант LexaK нравится больше.
&НаКлиенте
Процедура Тест(Команда)
   
    ПервоеЧисло = 40;
    ВтороеЧисло = 20;
    Результат = СформироватьУпорядоченныйСписокВыводаНаСервере(ПервоеЧисло, ВтороеЧисло);
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = Результат;
    Сообщение.Сообщить();
       
КонецПроцедуры

&НаСервере
Функция СформироватьУпорядоченныйСписокВыводаНаСервере(ПервоеЧисло, ВтороеЧисло)
   
    Результат = "";
    Если ПервоеЧисло > ВтороеЧисло Тогда
        ДобавитьКЧислу = 1;
    ИначеЕсли ПервоеЧисло < ВтороеЧисло Тогда
        ДобавитьКЧислу = -1;
    КонецЕсли;
    ПолучитьСписокРекурсивно(ПервоеЧисло, ВтороеЧисло, ДобавитьКЧислу, Результат);
    Возврат Результат;
   
КонецФункции

&НаСервере
Процедура ПолучитьСписокРекурсивно(ПервоеЧисло, ВтороеЧисло, ДобавитьКЧислу, Результат)
   
    Если ПервоеЧисло = ВтороеЧисло Тогда
        ДобавитьКРезультату(Результат, ВтороеЧисло);
    Иначе
        ПолучитьСписокРекурсивно(ПервоеЧисло , ВтороеЧисло + ДобавитьКЧислу , ДобавитьКЧислу, Результат);
        ДобавитьКРезультату(Результат, ВтороеЧисло);       
    КонецЕсли;
   
КонецПроцедуры

Процедура ДобавитьКРезультату(Результат, ДобавляемоеЗначение)
   
    Если Не ЗначениеЗаполнено(Результат) Тогда
        Результат = ДобавляемоеЗначение;
    Иначе
        Результат = СтрШаблон("%1, %2",Результат, ДобавляемоеЗначение);
    КонецЕсли;
   
КонецПроцедуры


OnePunch-Man

nvj84, LexaK, Kvark5d, Спасибо большое всем за помощь и Объяснения.

OnePunch-Man

nvj84, Ну это самый правильный и грамотно оптимизированный код, я так понимаю? Для меня это пока сложно ))

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск