2017-10-18 141 views
0

我正在尝试创建一个接收双精度(Double,Double)和n(Int)范围的函数,其中将该间隔分成n个相等部分。我知道如果它是一个列表,我在列表中做了Split,但是在元组中并获得了双精度,我不知道该怎么做。 感谢您的帮助将元组拆分为n个部分

+0

为什么会有所作为?如果你有'[1,2]'和'3',那么你不能简单地使用'split'来获得3个元组... –

+1

我假设两个double是下限/上限。然后有可能计算出'n'个相等的输出范围。但没有进一步的信息,人们只能假设实际的问题是什么。 – mschmidt

+0

是的,比方说,我得到a,b和n = 4的范围,我希望最终能够产生包含每个区间 – JohnTeiMir

回答

2

这类似于@ mschmidt的答案,但我认为一个列表的理解可能是清晰的:

intervals :: Int -> (Double,Double) -> [(Double,Double)] 
intervals n (a,b) = 
    let n' = fromIntegral n 
     d = (b - a)/n' 
    in [(a + i*d, a + (i+1)*d) | i <- [0..n'-1]] 

捐赠:

> intervals 4 (1,10) 
[(1.0,3.25),(3.25,5.5),(5.5,7.75),(7.75,10.0)] 
> 

如果重复计算的终点冒犯了你,你可以这样写:

intervals' :: Int -> (Double,Double) -> [(Double,Double)] 
intervals' n (a,b) = 
    let n' = fromIntegral n 
     d = (b - a)/n' 
     x = [a + i*d | i <- [0..n']] 
    in zip x (tail x) 

注意zip x (tail x)是一个非常标准的方式来获得连续对列表的元组:

> let x = [1,2,3,4] in zip x (tail x) 
[(1,2),(2,3),(3,4)] 
> 
+0

谢谢!只是一个问题,而不是给予:Int - >(Double,Double) - > [(Double,Double)],(Double,Double) - > Int - >(Double,Double)? – JohnTeiMir

+0

我不知道这个替代签名(只返回一个元组)应该做什么功能。你能举出一个如何调用它以及它应该返回的例子吗? –

+0

让我们说:intervls ::(Double,double) - > Int - > [(Double,Double)] – JohnTeiMir

1

草图,可能不是最优雅的解决方案:

  • 取两个输入双打(我称他们为lu),并计算输入范围/区间的宽度。
  • 您想计算n等宽度的输出范围w。通过将输入宽度除以n来计算此w
  • 构建长度包含值l+0*wl+1*wl+2*wn的列表,...
  • 通过在列表中的前两项组合成一个元组生成输出元组的列表。删除列表中的一个元素。继续,直到只剩下一个元素。
  • 试图抓住所有可能的错误
+0

的4元组谢谢!就像你说的:构建一个包含值l + 0 * w,l + 1 * w,l + 2 * w的长度为n的列表,我如何在这种情况下停止条件? – JohnTeiMir

+0

编写一个递归函数,该函数具有以'n'开头的整数参数,并在每个递归步骤中递减。如果0达到停止,否则做你的工作,并继续递归。 – mschmidt