Имя: Пароль:
1C
1С v8
Помогите с рекурсивной функцией
,
0 ACiD30rus
 
08.11.11
12:26
Привет. Подскажите как выкрутиться?!!...

Функция ВывестиСлова(Массив, Индекс)
Для Сч=1 По СтрДлина(Массив[Индекс]) Цикл
Переменная = Сред(Массив[Индекс], Сч, 1);        
Возврат (Строка(Переменная) + Строка(ВывестиСлова(Массив, Индекс+1, Уровней)));        
КонецЦикла;
КонецФункции

Т.е. при вызове этой функции возвращается только самый первый результат, а остальные не возвращаются, хотя возврат производится в цикле... Как быть, чтобы возвращались все возможные результаты? Как добиться продолжения выполнения после возврата или как изменить/переделать рекурсию чтобы возвращились все возможные значения?
1 Wobland
 
08.11.11
12:27
это работает? где выход из рекурсии? почему параметров то два, то три?
2 Reset
 
08.11.11
12:28
(0) Опиши задачу, а не (заведомо неверное) решение не известно чего
3 Reset
 
08.11.11
12:29
в (0) код неверный тупо синтаксически
4 ACiD30rus
 
08.11.11
12:37
Поступает массив, каждый элемент которого состоит из слова. Скажем в нашем случае Массив(йцу,фыв), где йцу-Массив[0],фыв-Массив[1]. После выполнения этой функции на выход должно выводиться йф,йы,йв,цф,цы,цв,уф,уы,ув. А у меня выходит только самый первый результат йф.
5 Wobland
 
08.11.11
12:38
(4) ты синтакчисеский контроль делал вообще? выходит у него...
6 Не Печенкин
 
08.11.11
12:39
>>После выполнения этой функции на выход должно выводиться йф,йы,йв,цф,цы,цв,уф,уы,ув

Выводиться простите что? Строка, массив? Функция в 1С способна вернуть только одно значение
7 Wobland
 
08.11.11
12:40
(6) например, массив
8 Не Печенкин
 
08.11.11
12:40
(7) хотелось бы у автора узнать, ну так и пусть выводит массив
9 ACiD30rus
 
08.11.11
12:43
синтаксически все нормально.
я хотел узнать возможно ли вернуть из рекурсии все возможные варинты или она вернет только один вариант - самый первый?
10 Wobland
 
08.11.11
12:44
(9) скрин с текстом "Синтаксических ошибок не обнаружено!" в студию!
11 Не Печенкин
 
08.11.11
12:45
(9) чукча writer only?
12 ACiD30rus
 
08.11.11
12:49
http://s1.ipicture.ru/uploads/20111108/Sr5RNMWT.jpg

написал же, что ошибся с кодом малость пока его сюда вставлял
Функция ВывестиСлова(Массив, Индекс)
Для Сч=1 По СтрДлина(Массив[Индекс]) Цикл
Переменная = Сред(Массив[Индекс], Сч, 1);        
Возврат (Строка(Переменная) + Строка(ВывестиСлова(Массив, Индекс+1)));        
КонецЦикла;
КонецФункции
13 Не Печенкин
 
08.11.11
12:51
(12) ты скажешь в виде чего тебе надо вывести результат?
14 Wobland
 
08.11.11
12:51
(12) ну а теперь рассказывай, что нужно
15 Wobland
 
08.11.11
12:51
(12) "написал же, что ошибся с кодом" - ложь
16 ACiD30rus
 
08.11.11
12:54
Не Печенькин, вывожу для проверки результат через Сообщить();

Т.е. в коде у меня выводится так:
Сообщить(ВывестиСлова(НашМассив, 0));
17 Asmody
 
08.11.11
12:54
там же на скрине написано "Конфигуратор - Курсовая". Что пристали к человеку?
18 Шапокляк
 
08.11.11
12:59
(16) А переменная Сч случайно не объявлена в модуле? Сверху на скрине не видно.
19 Asmody
 
08.11.11
13:00
прочитав три раза (4), я, кажись, понял, чего автор хочет.
у него есть набор слов, надо вывести все слова, составленные из букв этих слов. причём на первом месте должны стоять буквы из первого слова, на втором — из второго, и т.д.
только зачем тут рекурсия? достаточно 2-х вложенных циклов
20 Escander
 
08.11.11
13:01
(0) в чём вопрос? Вызвал функцию, в функции попал в цикл и внутри цикла команда возврата из функции. уберите цикл-конеццикла, результат будет тем-же. Программа отрабатывает в точности как вы ей сказали сделать!
21 Escander
 
08.11.11
13:03
(19) да, вложеные циклы... можно и 1 циклом справиться, но фактически никакого выигрыша не будет а даже наоборот.
22 kabanoff
 
08.11.11
13:04
(12) А зачем для этого чудо-алгоритма использовать объект метаданных "Документ"? О_о
23 Не Печенкин
 
08.11.11
13:15
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Тест = Новый Массив();
   Тест.Добавить("йцу");
   Тест.Добавить("фыв");
   Для каждого Эл Из ВывестиСлова(Тест) Цикл
       Сообщить(Эл);    
   КонецЦикла;
КонецПроцедуры


Функция ВывестиСлова(Массив,Индекс=0)
   Если Индекс=Массив.ВГраница() Тогда
       НовыйМассив = Новый Массив;
       НовыйМассив.Добавить("");
   Иначе
       НовыйМассив = ВывестиСлова(Массив,Индекс+1);
   КонецЕсли;
   Результат = Новый Массив;
   Для й=1 По СтрДлина(Массив[Индекс]) Цикл
       Для каждого Эл Из НовыйМассив Цикл
           Результат.Добавить(Сред(Массив[Индекс],й,1)+Эл);        
       КонецЦикла;    
   КонецЦикла;
   Возврат Результат;
КонецФункции
24 ACiD30rus
 
08.11.11
16:54
(23)Спасибо. Можно сказать только начинают кодить на эсине, поэтому недогнал как реализовать...
25 Kookish
 
08.11.11
17:20
Возврат в цикле... Свежо, нестандартно. Пятнично.