Простой рекурсивный алгоритм в Haskell
import Data.List
combinations 0 lst = [[]]
combinations n lst = do
(x:xs) <- tails lst
rest <- combinations (n-1) xs
return $ x : rest
Сначала определим частный случай, т. е. выбрав нулевые элементы. Он производит единственный результат, который представляет собой пустой список (т. Е. Список, содержащий пустой список).
При n> 0, x
проходит через каждый элемент списка, а xs
- каждый элемент после x
.
rest
выбирает n - 1
элементы из xs
, используя рекурсивный вызов combinations
. Конечным результатом функции является список, в котором каждый элемент x : rest
(т. Е. Список, который имеет x
в качестве главы и rest
как хвост) для каждого другого значения x
и rest
.
> combinations 3 "abcde"
["abc","abd","abe","acd","ace","ade","bcd","bce","bde","cde"]
И, конечно, поскольку Haskell ленив, список постепенно генерируется по мере необходимости, поэтому вы можете частично оценить экспоненциально большие комбинации.
> let c = combinations 8 "abcdefghijklmnopqrstuvwxyz"
> take 10 c
["abcdefgh","abcdefgi","abcdefgj","abcdefgk","abcdefgl","abcdefgm","abcdefgn",
"abcdefgo","abcdefgp","abcdefgq"]
Не закрепляйте свой пользовательский элемент управления. Вместо этого используйте свойство Anchor. (Прикрепите ко всем четырем сторонам). Установите свойство MinimumSize пользовательского элемента управления Установите свойство AutoScrollMinSize панели
Полосы прокрутки панели не появятся, если вы не установите его свойство AutoScrollMinSize. Установка параметра Dock пользовательского элемента управления на Fill, похоже, скрывает полосы прокрутки панели.
После InitializeComponent в диалоговой форме я сделал вот что, и, кажется, это сработало:
tableLayoutPanel1.AutoScrollMinSize = tableLayoutPanel1.GetPreferredSize(new Size(1, 1));
У меня есть куча вложенных панелей в таблице. Все строки и столбцы установлены на AutoSize. По какой-то причине элемент управления недостаточно умен, чтобы сообщить элементу управления прокруткой его предпочтительный размер.