我在 haskell 中有一段代码,它生成由三部分组成的数字:
kompozycje n = [ (x,y,z) | x<-[1..n], y<-[1..n], z<-[1..n], x+y+z==n]
我想做一些类似 kompozycje n k 的东西,它会生成 k 部分的组合,然后如果例如 k 等于 4,则会返回四个变量和四个数字,并且在条件下会出现类似 u+x+ 的东西y+z==n。有一些简单的解决方案吗?
最佳答案
是的,是的,有。它使用列表 monad 和 replicateM
。
import Control.Monad
summy :: Integer -> Integer -> [[Integer]]
summy k n = do
ls <- replicateM k [1..n]
guard (sum ls == n)
return ls
或者只是
summy k n = filter ((==n) . sum) $ replicateM k [1..n]
在列表 monad 中,replicateM
将生成所有可能的长度为 k
的列表,由数字 1 .. n
组成。
这确实会生成重复项,例如 [1, 2, 1]
和 [1, 1, 2]
。但你原来的方法也是如此。
关于Haskell,算法所有可能的数字组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914859/