2

私は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)])

私はそれをどのように機能させるのか分かりません。誰かが私がこれを修正するのを手伝ってもらえますか?

どうも。

4

1 に答える 1

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])
于 2012-05-16T21:08:14.340 に答える