2010-10-23 41 views
1

我需要的功能与签名diffFolge :: (Integer, Integer) -> [Integer],其中当施加到所述参数对(m, n)m, n> 0)返回号码的降序列表,这些数字之间的差beeing n。 结果列表的第一个元素是m,最后一个元素始终大于0,最后一个元素 要么0要么是严格小于0的值。差副产品

我写如下:

diffFolge :: (Integer,Integer) -> [Integer] 
diffFolge (m,n) = if m > 0 && n > 0 then [m,m-n..n-2*n] else [] 

例如

input : diffFolge (5,1) 
output : [5,4,3,2,1,0] 

例如

input : diffFolge (5,2) 
output :[5,3,1,-1] ---> This is true by my code 

然而,在第一个例子我的函数返回[5,4,3,2,1,0,-1]给出的输入。我该如何解决这个问题?

回答

0

不知道我理解你想要什么,但我猜测这是它:

diffFolge (m,n) | m <= 0 = [m] 
       | otherwise = m : diffFolge (m-n,n) 

在你的代码中的错误是真的在你的序列中的最后一个元素, n - 2*n,注意 ,这等于-n,所以你的列表不会停止,直到你得到一个严格小于-n的元素,但是在你的列表包含0的情况下,最后一个元素的下一个元素是0,最后一个元素是-n。要解决这个问题,您可以简单地将1添加到它:[m,m-n..1-n]。那么如果列表中包含0,则排除-n,并且如果它不包含0,则最后一个元素介于01-n之间。

+0

这就是答案我在找什么谢谢你... – marco 2010-10-23 13:56:25

5

Haskell的[a..b]语法返回列表如果可能,包括b

您可以使用[m, m-n .. 1-n],这样排除-n

(顺便说一句,n-2*n == -n

+0

这是事实,但例如当我给这个例如diffFolge(5,2)输出muss so [5,3,1,-1] – marco 2010-10-23 13:13:08

+0

@ifan:请参阅更新。 – kennytm 2010-10-23 13:47:52

1

对我来说也会发生,你已经断言M> = N 所以这里有一个快速的想法:

diffFolge :: (Integer, Integer) -> [Integer] 
diffFolge (m,n) 
    | m <= 0 || n <= 0 = [] 
    | n > m = diffFolge (n,m) -- | Only if you want this case 
    | otherwise = takeWhile (>= 0) $ iterate (\x->x-n) m 
+0

谢谢你 – marco 2010-10-23 14:06:43

2

有时,它支付给做数学的只是一点点。 :)

diffFolge (m, n) = [m, m-n .. 1-n] 

此外,使用元组的多个参数到Haskell中的函数是不寻常的。我会更容易写

df m n = [m, m-n .. 1-n] 

然后,如果由于某种原因,我真的需要一个函数取一个元组,我会写:

diffFolge = uncurry df 
+0

啊,我错过了KennyTM已经指出的答案。 – Yitz 2010-10-23 20:49:14