Цитата:
Сообщение от
dn
Задачу можно решить либо быстро, либо красиво... Решение с "бросанием костей" изначально не претендует на минимизацию кол-ва проходов цикла, но зато не надо долго ломать голову над алгоритмом.
Теперь насчет стандартных типов данных. Все правильно, но только для программиста на X++ container и set, являются более стандартными типами, чем массив, ИМХО. Я не припомню что-то практических задач в Axapta, где мне бы потребовалось использовать массив...
А на закуску "красивое" решение, вообще без циклов

***
Эта, однозначно, пять!

"Респект и уважуха" (с).
Что бы вы не делали, всегда нужно стремиться сделать это красиво! Ведь "красота спасет мир" (С)

.
Позволю себе небольшое исправление вашего "шедевра"
X++:
#define.N(5)
static void job001(Args _args)
{
str 1 a[#N];
str resource = 'abcdefghijklmnopqrstuvwxyz';
Set validateSet; // Автоматическая проверка
void init(Int _idx)
{
if (_idx == 0)
return;
a[_idx] = substr(resource, _idx, 1);
init(_idx - 1);
}
str makestr(str 1 b[#N], int level = 1)
{
return (level<#N)?b[level]+makestr(b,level+1):b[level];
}
void show (str 1 b[#N])
{
str result;
;
result = makestr(b);
if (validateSet.in(result))// Автоматическая проверка
{
error('Doubling!');
}
else
{
info(result);
validateSet.add(result);
}
}
void f(str 1 b[#N], int level=1, int shift=1)
{
str 1 c[#N];
;
if (level < #N-1)
{
f(b,level+1,1);
}
if(shift <= #N-level)
{
c=b;
c[level] = b[level+shift];
c[level+shift] = b[level];
show(c);
f(c,level,shift+1);
}
}
;
validateSet = new Set(Types::String); // Автоматическая проверка
init(#N);
show(a);
f(a);
info(strfmt('Total: %1 elements.', validateSet.elements())); // Автоматическая проверка
}
Ну, собственно, на этом можно считать DAX-сообщество подготовленным к собеседованию в Goooogle

.