Цитата:
Сообщение от
CDR
Ура! Это решение вроде как работает для всех n!
Единственный серьезный минус - количество проходов цикла.
...
И еще желательно в решении не используются нестандартные типы данных: контейнер, множество. Лучше все-таки обойтись стандартными типами данных - целые и вещественные числа, строки, а так же их массивы.
Небольшая оптимизация цикла и используемых типов данных - и решение получится идеальным

.
Задачу можно решить либо быстро, либо красиво... Решение с "бросанием костей" изначально не претендует на минимизацию кол-ва проходов цикла, но зато не надо долго ломать голову над алгоритмом.
Теперь насчет стандартных типов данных. Все правильно, но только для программиста на X++ container и set, являются более стандартными типами, чем массив, ИМХО. Я не припомню что-то практических задач в Axapta, где мне бы потребовалось использовать массив...
А на закуску "красивое" решение, вообще без циклов
X++:
#define.N(5)
static void job001(Args _args)
{
str 1 a[#N];
void init()
{
a[1] = 'a';
a[2] = 'b';
a[3] = 'c';
a[4] = 'd';
a[5] = 'e';
}
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])
{
;
//info(b[1]+b[2]+b[3]+b[4]+b[5]);
info(makestr(b));
}
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);
}
}
;
init();
show(a);
f(a);
}