| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
serglif 22.07.2004 14:21
Задача: сделать список всех перестановок слов набора, слова разделены запятыми.#Разбиваем строку по запятым
$split_words[^words.split[,]]
#Делаем новую таблицу, где слова нумеруем
$numered_words[^table::create{id words}]
$i(0)
^split_words.menu{
^numered_words.append{$i $split_words.piece}
^i.inc[]
}
#Делаем новую таблицу под варианты перестановок
$variants[^table::create{name}]
#Рекурсивная процедура создания перестановок
^getvariants[$numered_words;$variants;;0]
# Описание процедуры. Параметры: splits - таблица всех слов,
# variants - таблица для сохранения вариантов перестановок,
# cur_variant - текущее начало варианта перестановки, cnt -
# битовая маска (единица в бите, если слово уже задействовано)
@getvariants[splits;variants;cur_variant;cnt][curent_words]
#Отбираем те слова, на которые нет битов в маске...
$curent_words[^splits.select(^eval(^math:pow(2;^splits.id.int[])&^cnt.int[]) eq 0)]
#Если такое слово одно - конец ветки рекурсии, добавляем вариант в таблицу
^if(^curent_words.count[] eq 1){
^variants.append{$cur_variant $curent_words.words}
}{
#Если таких слов несколько, запускаем их перебор и для каждого запускаем рекурсию
^curent_words.menu{
^getvariants[$splits;$variants;$cur_variant $curent_words.words;^eval($cnt+^math:pow(2;^curent_words.id.int[]))]
}
}Максимальное количество слов, которое может обработать - 7 (5040 вариантов). 8 - в Виндозе вылетает по ошибке: Тоо many heap sections (что-то типа), в Юниксе запускать не решился.. если что упадет - не подниму... Пробовал приделывать ^memory:compact[], но или не туда приделывал, или не помогает... Результата не дождался... Подскажите - это особенности рекурсии, или мои ошибки?