Изменения

Перейти к: навигация, поиск
Нет описания правки
Данный алгоритм генерирует все объекты заданного типа в лексикографическом порядке. На каждом шаге генерируется минимальный возможный префикс требуемого объекта.
Пусть <tex>Gen*genObj(K, p)</tex> {{---}} процедура генерирования, где <tex>*'''int''' p</tex> {{---}} глубина рекурсии, *'''list <texA>''' K</tex> {{---}} текущий комбинаторный объект.*'''int''' len {{---}} требуемый размер объекта*'''list <A>''' alpha {{---}} все возможные элементы комбинаторного объекта, отсортированные в лексикографическом порядке*'''int''' n {{---}} размер alpha
  Gen'''list <A>''' genObj(K, p) '''if ''' p = <требуемый размер объекта>= len //если сформирован объект нужного размера, то возвращаем его <выводим> '''return''' K '''else''' '''for <все w из алфавита на котором строится K>''' i = 1 .. n '''if ''' к объекту К можно добавить элемент a[i] в конец K.pushback(K + wa[i]) = <корректный префикс требуемого объекта> GengenObj(K + w, p + 1) //добавляем a[i] в конец и вызываем функцию genObj от нового полученного префикса К.pop_back()
==== Генерация с помощью процедуры получения следующего объекта ====
==== Пример генерации сочетаний из N элементов по M в лексикографическом порядке ====
Пусть Данный алгоритм генерирует все сочетания из <tex>genn</tex> элементов по <tex>m</tex>. *genChooses(k, l)</tex> {{---}} процедура генерирования, где *'''list <texint>''' a</tex> {{---}} текущее сочетание, <tex>*'''int''' k</tex> {{---}} следующий элемент в сочетании, <tex>*'''int''' l</tex> {{---}} глубина рекурсии.
gen'''list <int>''' genChooses(k, l); a[l] = k; '''if ''' l == m then <проверка на требуемый размер объекта> begin'''return''' a '''for j = 1 to m do write(a[j], ' '); <вывод объекта> writeln; end else for ' i = k + 1 to n do gen(i, l + 1);
==== Пример работы процедуры генерации ====
48
правок

Навигация