2017-10-18 144 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