我正在学习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]]
还有其他更优雅的解决方案吗?
答案 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]]