2012-05-16 49 views
2

我是Haskell的新手,我遇到了小問題。 我想寫一個函數來識別列表是否是算術序列。Haskell算術序列的識別

我這個不工作代碼:

isArithmSeq :: [Int] -> Bool 
isArithmSeq [] = False; 
isArithmSeq [x] = False; 
isArithmSeq [x,y] = True; 
isArithmSeq (x:y:xs) = (sum (x:y:xs)) == (sum [x,y..(last xs)]) 

我不知道如何使它發揮作用。任何人都可以幫我解決這個問題

Thx。

回答

2

試試這個:

isArithmSeq :: [Int] -> Bool 
isArithmSeq [] = False 
isArithmSeq [x] = False 
isArithmSeq [x,y] = True 
isArithmSeq (x:y:z:xs) = (x - y) == (y - z) && isArithmSeq (y:z:xs) 

您已經定義了一個遞歸定義一個不錯的基本情況。現在,您只需檢查連續元素之間的差異總是相同的。之所以說

isArithmSeq (x:y:xs) = (sum (x:y:xs)) == (sum [x,y..(last xs)]) 

沒有工作是因爲和是不是一個等差數列的唯一要求:

(sum [2,3,4,0,11,7]) == (sum [2,3,4,5,6,7]) 
+2

如果一個等差數列是「所有後續差異平等」,則[]和[x]情況應該是真實的,真實的。有一個很好的單行使用'all'和'zipWith'。 – pigworker

+0

我也不喜歡空的和單元素列表給False,但這就是它看起來像提問者想要的問題。我認爲他們有這個部分工作,他們喜歡它。你可能是對的,甚至有更聰明的方法來解決這個問題。 –