23.09.2008, 17:10 | #35 |
MCTS
|
Цитата:
Сообщение от 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())); // Автоматическая проверка } |
|