Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 2

Задача на разбиения списка на k непустых частей

29.09.2016, 17:52. Показов 1799. Ответов 4

Студворк — интернет-сервис помощи студентам
Привет жителям форума. Столкнулся с проблемой написания кода. Пробовал и partition и split, но так и не понял, каким образом ее решить. Формулировка: "Напишите функцию, которая по заданным n и k возвращает список всех разбиений {1..n} на k непустых частей"
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2016, 17:52
Ответы с готовыми решениями:

Жадный алгоритм разбиения массива на n частей
Всем привет. Понадобилось разбить массив на n приблизительно равных частей. Нашёл где-то на просторах инета якобы жадный алгоритм...

Присвоить переменной значение, равное количеству непустых строк непустых в таблице Excel
Нужно переменной присвоить значение, равное количеству строк(непустых) в заданной таблице (xlsx). Как это сделать?

Даны два непустых списка целых чисел L1 и L2
Даны два непустых списка целых чисел L1 и L2. Создать программу, которая строит список L3, содержащий (без повторения) все числа,...

4
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38192 / 21125 / 4309
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
29.09.2016, 19:15
Думаю, эту задачу можно свести к разбиению целых чисел. Вот неплохое руководство по алгоритмам разбиения.
2
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
29.09.2016, 20:35
Вот пример разбиения списка xs на k частей

Haskell
1
2
3
4
5
6
7
8
import Data.List
 
partlist xs 1 = [ [xs] ]
partlist xs k = [ initPart : tailPartitionVariant
                | (initPart, tailPart) <- zip (inits xs) (tails xs)
                , initPart /= []
                , tailPart /= []
                , tailPartitionVariant <- partlist tailPart (k-1) ]
Работает так:
Разобъем список xs на две части где-нибудь посередине - на начальную часть (initPart) и конечную часть (tailPart).
Начальную часть будем считать одной из наших k частей. А tailPart снова разобъем, но уже на (k-1) частей, ведь одну из k частей мы уже сформировали.

Далее склеим все варианты разбиения конечной части c начальной частью. Получим список всех разбиений.

Ну и конечное условие рекурсии. Когда останется разбить список всего на одну часть (k = 1), то возвращаем весь список. Ведь он и является этой единственной частью.

Конструкция zip (inits xs) (tails xs) позволяет получить все вариант разбиения одного списка на две части

Haskell
1
2
3
4
Prelude> let xs = [1..5]
Prelude> import Data.List
Prelude Data.List> zip (inits xs) (tails xs)
[([],[1,2,3,4,5]),([1],[2,3,4,5]),([1,2],[3,4,5]),([1,2,3],[4,5]),([1,2,3,4],[5]),([1,2,3,4,5],[])]
То же самое можно было получить и с помощью функции splitAt n xs, пробежавшись по нужным n
2
0 / 0 / 0
Регистрация: 29.09.2016
Сообщений: 2
29.09.2016, 22:14  [ТС]
Спасибо за решение и детальное объяснение, но суть чуть-чуть в другом. Как пример, могу написать так:
partitions 4 2 == [[3,1],[2,4]]
Это входные данные и что он должен вывести. То бишь, список размером n нужно просто разделить на k подсписков.
Попробовал сделать через splitPlaces, но не импортирует Data.List.Split

Haskell
1
2
3
4
5
6
7
8
9
10
11
import Data.List
import Data.List.Split
getSplitPlaces :: Int -> Int -> [Int]
getSplitPlaces 0 _ = error("blabla")
getSplitPlaces _ 0 = error("blabla")
getSplitPlaces n k | (n <= k) = [n]
                   | otherwise = let nk = n `div` k in nk : (getSplitPlaces (n-nk) k)
partitions 0 _ = [[]]
partitions _ 0 = error("blabla")
partitions n k = splitPlaces (getSplitPlaces n k) [1..n]
main = print $ partitions 4 3
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
30.09.2016, 12:12
Цитата Сообщение от xdraw Посмотреть сообщение
Спасибо за решение и детальное объяснение, но суть чуть-чуть в другом. Как пример, могу написать так:
partitions 4 2 == [[3,1],[2,4]]
А например [[1],[3,4,2]] тоже должен вывести?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.09.2016, 12:12
Помогаю со студенческими работами здесь

Задача разбиения множества чисел
Типовая задача, наверняка есть уже решение такой задачи, просто плохо гуглю судя по всему. public boolean apart(List&lt;Integer&gt;...

Программа разбиения списков всех месяцев года на 2 списка
программа разбиения списков всех месяцев года на 2 списка.в одном все месяцы до указанного включительно,во втором списке все месяцы после...

Задача разбиения суммы на выдачу минимальным количеством банкнот
Необходимо определить, как заданную сумму денег выразить минимальным количеством банкнот по 500, 100, 10, 5, 2 и 1 рублю. static void...

Функция поиска частей списка с рекурсией
Приветствую, форумчане. Прошу опытных гуру Лиспа помочь с решением задания: Нужно написать функцию, которая принимает два аргумента,...

Разделения списка на несколько равных частей.
Есть к примеру список s = Как разделить его на несколько частей, чтобы получилось примерно вот что: , , ] Я вот такой код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru