Новости | 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[], но или не туда приделывал, или не помогает... Результата не дождался... Подскажите - это особенности рекурсии, или мои ошибки?