如何在haskell中实现sigma?

时间:2014-06-07 19:52:36

标签: algorithm haskell

我正在学习haskell而我正试图解决http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1098

我使用其他语言解决了这个问题所以我知道解决方案

answerTo(n, d) = func(n, d) - func(n, d - 1)

func(n, d) = Σ(func(k - 2, d -1) * func(n - k, d)) | 2 <= k <= n, k is even
func(0, d) = 1

我需要在haskell中实现func。我不知道怎么做。

func n d
    | n < 0 || d < 0 = 0
    | n == 0 && d >= 0 = 1
    | otherwise = --need to implement Σ(func (k - 2) (d -1)) * (func (n - k) d) | 2 <= k <= n, k is even
我以这种方式解决了

func (n, d)
    | n == 0 && d >= 0 = 1
    | n < 0 || d < 0 = 0
    | otherwise = sum (zipWith (*) (map func arg1) (map func arg2))
    where
        arg1 = [(k - 2, d - 1) | k <- filter even [2..n]]
        arg2 = [(n - k, d) | k <- filter even [2..n]]

还有其他更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:2)

Math.NumberTheory.Primes.Factorization包中的arithmoi模块包含一个σ函数,可能是您需要的函数,以及其他相关函数。如果您愿意,可以单击该功能的源代码。

修改

现在您已经澄清了您的意思,答案很简单。您需要枚举所需的值,然后对它们求和。最简单的方法是使用sum函数对使用列表推导创建的列表求和:

func n d
    | n < 0 || d < 0 = 0
    | n == 0 && d >= 0 = 1
    | otherwise = sum [func (k - 2) (d - 1) * func (n - k) d | k <- [2,4..n]]