作者drm343 (一卡那亚)
看板Programming
标题Re: [问题] 排列组合,相同物品分发制不同容器
时间Mon Apr 16 09:22:33 2012
※ 引述《bob123 ()》之铭言:
: ※ 引述《lovesnake (【忠犬攻一枚】)》之铭言:
: : 求标题之演算法
: : 其实就是分堆啦
: : 假设有五个东西,分成三堆有几种分法这样
: : 1 1 3
: : 1 2 2
: : 2 1 2
: : 2 2 1
: : 1 3 1
: : 3 1 1
恕删
看了 bob123 前辈的写法,我总算搞懂这题是要做什麽了XD
用 haskell 来写大概像这样
f :: [ Integer ] -> [ ( Integer , Integer , Integer ) ]
f x = [ ( x1 , y1 , z1 ) | x1 <- x , y1 <- x , z1 <- x , (fromInteger (x1 + y1 + z1) :: Int) == (length x)]
因为 length 用的是 Int,而传入的数值是 Integer,所以要用 fromInteger 转型
Ghci 下的范例:
let x = [1,2..5]
f x
结果:
[(1,1,3) , (1,2,2) , (1,3,1) , (2,1,2) , (2,2,1) , (3,1,1)]
---------------------------------------------------------
每次 PO 文都会以为在用 vim 而不自觉按下 Esc 跟 i.......
---------------------------------------------------------
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.113.131.116
1F:→ lovesnake:原来我原本的题目讲得很不清楚 Orz Sry 140.121.216.68 04/16 12:46
2F:推 yauhh:其实BBS编辑器比较接近nano 59.112.229.87 04/16 20:18
3F:→ yauhh:为什麽你特别用了fromInteger? 59.112.229.87 04/16 20:29
程式中我宣告
> f :: [ Integer ] -> [ ( Integer, Integer, Integer ) ]
如果不用 fromInteger,会因为下面这段
> ((x1 + y1 + z1 ) :: Int)
而自动把 x1、y1、z1 转型成 Int,这样就不符合我的型态宣告了。
如果不做任何形态宣告,的确可以不写 fromInteger。
它的 type 会是
> f :: [ Int ] -> [ ( Int, Int, Int ) ]
※ 编辑: drm343 来自: 59.113.132.186 (04/17 14:18)
4F:→ bob123:互相学习而已~叫在下前辈实不敢当Orz... 223.140.59.240 04/19 02:46