Haskell,算法所有可能的数字组合

标签 haskell numbers combinatorics composition

我在 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/

相关文章:

Java DecimalFormat 包含左侧的所有数字

algorithm - 如何计算给定排列的字典排序

scala - 接受两个monadic值并返回一个monadic值的泛型函数

haskell - 如何在 Haskell 的函数中重新分配变量?

haskell - 'Either e` 包中 `Failure` 的 "failure"实例存在问题

c# - 如何使用 C# 计算整数的二进制表示中的尾随零

javascript - JavaScript 中的数字计算

python - 排列的秩

java - 如何在java中读取 vector

haskell - 为什么 Haskell 的 import-as 中的这些极端情况会起作用以及它们的作用是什么?