parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

О гвоздях и микроскопе... можно сделать по другому?

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