Рекурсив суперкомпозиция.
Рекурсив суперкомпозиция, рекурсив композиция сингари, рекурсив функция ёрдамида амалга оширилади:
d1 = (l1, {l2, l1}, l3);
d2 = {l4, (l1, l5)};
d3 = (l6, l2);
Func(tree, 0) = tree;
Func(tree, n) = Func(tree[11->d2, 12->d3], n-1);
Func(d1, 2);
Натижа:
({14,({14,(11,15)},15)},
{(16,(16,12)),{14,({14,(11,15)},15)}},13)
Тавсия етилган тилдан турли хил тўпламларнинг хусусиятларини ўрганиш учун кенг фойдаланиш мумкин, ишлаб чиқариш алгоритмларини тузиш усули ва бўлган комбинаториал объектларни рақамлаш тилнинг асоси бунга жуда мос келади.
Баландлиги йўқ бўлган иккилик дарахтларни яратиш н дан ортиқ, ёза оламиз
w(0) = ;
w(n)={w(0),w(n-1),w(n-1),(w(n-1), w(n-1))};
Бу ерда w- бу чақириладиган рекурсив функция дарахт керакли дарахт.
Ўсиб бораётган дарахтларни яратиш учун сиз ёзишингиз мумкин:
sum(low, high, cur, iter_func, tree) =
sum(low, high, cur+1, iter_func, tree[ +iter_func(high, cur)]);
sum(low, high, high, iter_func, tree)= tree[+ iter_func(high, high)];
sum(low, high, iter_func) = sum(low,high, low, iter_func, {});
iter_w(n, i)=(w(i), w(n-i), C(i, n));
w(0) = ;
w(n) = sum(0, n-1, iter_w);
Таклиф қилинган тил ёрдамида [3] да муҳокама қилинган барча авлод алгоритмларини ёзиш мумкин.
Тил таржимони кутубхонага асосланган аотрее Андоза синфини амалга ошириш. Бу синф-бу амалга ошириш "дарахт ва / ёки" маълумотлар тузилиши ва оммавий-мос келади.
Бу ҳисоблаш учун алгоритмларни амалга оширади дарахт вариантлари ва / ёки, дарахт вариантларини яратиш ва рақамлаш алгоритмлари ва / ёки [3], амалга оширади бир неча турдаги дарахтларни кесиб ўтиш учун итераторлар ва дарахт вариантларига кириш учун итераторлар ВА / ЁКИ. Генераторни тавсифлаш тилининг таржимони tilda ёзилган дастурларнинг барча елементларига киришни таъминлайди, бу еса таржимонни турли хил дастурий тизимларда ишлатишга имкон беради.
Дастурда генераторни тавсифлаш тилининг таржимонидан фойдаланиш мисолини кўриб чиқамиз комбинацион генераторни яратиш учун C++ тили. Яратилган қийматлар тест тизимининг киришига берилади:
Interpreter interpret;
string program = «\C(m, n) = {C(m, n-1), C(m-1, n-1)};\
C(m, m) = ;\
C(0, n) = ;\
var(C(2, 4), 3);»;
aotreevariant = interpret.run(program);
TestSystem<Ушбу мисолда генераторни тавсифлаш тилида ёзилган дастур ёрдамида дарахт қурилишининг рекурсив таркиби тасвирланган Ва / ёки комбинациялар учун дарахт қурилмоқда ва / ёки C (2, 4) ва ҳосил бўлган дарахтдан 3-сонли дарахт варианти чиқарилади. Олинган variant variant ўзгарувчисига жойлаштирилган ва VariantConverter, класси томонидан конвертация қилинганидан сўнг, TestSystem синов остида тизимнинг киритилишига берилади.
typedef aotreerestree;
Interpreter interpret;
string program = «\C(m, n) = {C(m, n-1), C(m-1, n-1)};\
C(m, m) = ;\
C(0, n) = ;\
C(2, 4);»;
restree tree = interpret.run(program);
for(restree::variator v=tree.vbe-gin(); v!=tree.vend(); v++)
TestSystem << VariantConverter(v);
Ушбу мисолда комбинация дарахтининг барча вариантлари C (2, 4) ёрдамида олинади iterator аотрее синф вариантларининг. Юқоридаги мисоллардан кўриниб турибдики, тил таржимонидан фойдаланиш жуда оддий, код миқдори сезиларли даражада камаяди ва C++да ушбу мисолларни тўғридан-тўғри дастурлаш ҳолатига қараганда аниқроқ.
Хулоса
1. Комбинаториал тўплам генераторларини қуриш ва тадқиқ қилиш учун universal восита таклиф етилади, бу комбинаториал тўпламни рекурсив дарахт таркиби схемаси ва/ёки шаклида намойиш етишга асосланган вариантларни яратиш ва рақамлаш алгоритмлари.
2. Дарахтларнинг рекурсив композициялари схемаларини ва/ёки ва уларни таҳлил қилиш асосида тавсифлашга имкон берадиган янги функционал тил тасвирланган, ўрганилаётган комбинаториал тўпламга мос келадиган вариантларни яратиш ва рақамлаш алгоритмларини яратиш.
3. Тизим кутубхонасини кенгайтириш каби воситани амалга оширишнинг бир варианти таклиф етилади C++ дастурлаш тили учун СТЛ.
Do'stlaringiz bilan baham: |