Показать сообщение отдельно
Старый 23.09.2008, 11:55   #71  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Сообщение от 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);
}

Последний раз редактировалось dn; 23.09.2008 в 11:59.
За это сообщение автора поблагодарили: CDR (1).