Да ладно уж, просто ты перебираешь все непустые и неединичные подмножества, а я — те, которые идут подряд, то есть решаю первую задачу Но это, как ты понимаешь, непринципиально:
Здравствуйте, Mamut, Вы писали:
M>Как оказалось, условие я и сам неправильно понял. Оказалось, что надо не просто суммы смежных двоек, троек и т.д., а все гораздо хуже Необходимо суммы всех возможных групп чисел вообще. Т.е. а1 + а2, а1 + а3, а1 + а4, ...., а1 + а2 + а3, а1 + а3 + а4, ..., а2 + а3, ..., а2 + а4 + а5, ...
M>И потом получившиеся суммы поставить в порядке возрастания. На вопрос "а нафига это надо", друг не ответил, сказал, что надо А я уже обещался помочь
Я, видимо, все неправильно понял, и в ФП полный чайник, так что не судите строго. Просто задача очень похожа на упражнение из Харпера. Вот решение на ОКамле (извините, Хаскеля не знаю):
let rec powerset lst = match lst with
[] -> [ []]
| h::t ->
let pstail = powerset t in
let diff = List.map (fun x -> h::x) pstail in
pstail @ diff
let sum_list lst = List.fold_left (+) 0 lst
let all_sums lst =
let ps = powerset lst in
let sums = List.map sum_list ps in
List.sort compare sums
Глеб Алексеев,
ГА>Я, видимо, все неправильно понял, и в ФП полный чайник, так что не судите строго. Просто задача очень похожа на упражнение из Харпера. Вот решение на ОКамле (извините, Хаскеля не знаю):
ГА>
ГА>let rec powerset lst = match lst with
ГА> [] -> [ []]
ГА> | h::t ->
ГА> let pstail = powerset t in
ГА> let diff = List.map (fun x -> h::x) pstail in
ГА> pstail @ diff
ГА>let sum_list lst = List.fold_left (+) 0 lst
ГА>let all_sums lst =
ГА> let ps = powerset lst in
ГА> let sums = List.map sum_list ps in
ГА> List.sort compare sums
ГА>
Я бы ввёл ещё парочку функций
let rec size l = match l with
| [] -> []
| h::t -> 1 + size t;;
let rec seive l = match l with
| [] -> []
| h::t ->
if (size h) > 1 then
h::seive t
else
seive t;;
и переписал бы all_sums как
let all_sums lst =
let ps = seive powerset lst in
let sums = List.map sum_list ps in
List.sort compare sums;;
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>1. что такое ; (точка с запятой) в К? (подозреваю что композиция)
Скорее, разделитель.
LCR>2. где ты умудрился скачать К? Ссылкой не поделишься
На kx.com. Только они его уже убрали.
Чувствую, что написал или лишнего, или некрасивого кода, и гуры надо мной издеваются, только в чем я неправ — не пойму.
По порядку.
LCR>Я бы ввёл ещё парочку функций LCR>
(* А разве нету готовой функции List.length? *)
LCR>let rec size l = match l with
LCR> | [] -> [] (* А здесь [] с ноликом не перепутали? *)
LCR> | h::t -> 1 + size t;;
(* А зачем такое решето, если
1) пустой список в результатах по определению только один
2) сумма пустого списка равна нулю
3) в условии задачи никто не говорил выбрасывать пустое множество
4) и если все-таки его писать, то чем не подошел List.filter, зачем вручную?*)
LCR>let rec seive l = match l with
LCR> | [] -> [] (* а здесь пару лишних [] не забыли? *)
LCR> | h::t ->
LCR> if (size h) > 1 then
LCR> h::seive t
LCR> else
LCR> seive t;;
LCR>
LCR>и переписал бы all_sums как LCR>
LCR>let all_sums lst =
LCR> let ps = seive powerset lst in
LCR> let sums = List.map sum_list ps in
LCR> List.sort compare sums;;
LCR>
LCR>
На всякий случай тоже улыбнусь .
з.ы. После пары месяцев активного пребывания на РСДНе я всегда компилирую и разок запускаю код, который сюда выкладываю
ГА>(* А разве нету готовой функции List.length? *)
ГА>
+1 есть, но я не смог вспомнить, как она называется
LCR>>let rec size l = match l with
LCR>> | [] -> [] (* А здесь [] с ноликом не перепутали? *)
+1 перепутал; со скобками даже не откомпилируется
ГА>(* А зачем такое решето, если
ГА> 1) пустой список в результатах по определению только один
ГА> 2) сумма пустого списка равна нулю
ГА> 3) в условии задачи никто не говорил выбрасывать пустое множество
ГА> 4) и если все-таки его писать, то чем не подошел List.filter, зачем вручную?*)
Да тут задача ведь складывать двойки, тройки и т.д., а у тебя пустое множество и все одноэлементные вошли. Вот и потребовалось "решето". Насчёт List.filter — , вместо того чтобы глянуть в доку и освежить память, я делаю велосипедик.
LCR>>let rec seive l = match l with
LCR>> | [] -> [] (* а здесь пару лишних [] не забыли? *)
а здесь всё правильно, ибо функция seive должна выкидывать все элементы кроме не очень маленьких по длине. (элементы — списки, val seive : 'a list list -> 'a list list = <fun>), а из пустого списка выкинуть нечего. Если сделать []], то в результирующий список войдёт элемент [], что неправильно.
ГА>з.ы. После пары месяцев активного пребывания на РСДНе я всегда компилирую и разок запускаю код, который сюда выкладываю
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Да тут задача ведь складывать двойки, тройки и т.д., а у тебя пустое множество и все одноэлементные вошли.
Кстати, не факт: Mamut>Необходимо суммы всех возможных групп чисел вообще
Здравствуйте, Глеб Алексеев, Вы писали:
ГА>Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>>Да тут задача ведь складывать двойки, тройки и т.д., а у тебя пустое множество и все одноэлементные вошли. ГА>Кстати, не факт: Mamut>>Необходимо суммы всех возможных групп чисел вообще
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>>>2. где ты умудрился скачать К? Ссылкой не поделишься Т>>На kx.com. Только они его уже убрали. LCR>вот вот.