2

Ints の特定のリストが三角形かどうかを決定する関数を (プリロードされた関数を使用せずに) 作成する必要があります。三角形とは、特定の数まで増加してから減少するかどうかを意味します。次に例を示します。

[2,4,5,7,4,3] だけでなく: [], [1], [1,1], [1, 2, 3], [3, 2, 1], [1, 2, 2]、[2、2、1] (非厳密な増減)

私はこれを思いつきましたが、次に何をすべきかわかりません。アドバイスをいただければ幸いです。

ex :: [Int] -> Bool
ex [] = True
ex (x:xs) | 
4

2 に答える 2

4

ちょっとした楽しみとして、まったく異なるフレーバーのソリューションをまとめてみようと思いました。L数値のリストの代わりに、数値が減少したEとき、同じままだったGとき、または数値が大きくなったときの文字列があると想像してみてください。三角形であるということは、その文字列が通常の言語であるかどうかをテストすることを意味します[LE]*[GE]*。それがこのソリューションで行うことです。正規表現を作成し、数値の要約が一致するかどうかを確認します。私はregex-applicativeを使用していますが、必要に応じて、代わりにお気に入りの正規表現ライブラリを使用できます。

{-# LANGUAGE NoMonomorphismRestriction #-}
import Data.Maybe
import Text.Regex.Applicative

triangular = many (sym LT <|> sym EQ) *> many (sym GT <|> sym EQ)
summarize xs = zipWith compare xs (tail xs)

ex = isJust . match triangular . summarize

ghci のすべての例で試すことができます。

*Main> map ex [[2,4,5,7,4,3], [], [1], [1, 2, 3], [3, 2, 1], [1, 2, 2], [2, 2, 1]]
[True,True,True,True,True,True,True]
*Main> ex [2,3,4,3,2,3,4] -- plus one I made up to check it's not const True
False
于 2013-10-06T23:26:16.417 に答える
3

開発中にいくつかのコードを説明しようと思います。問題は明らかに 2 つに分割できます。リストの増加部分とリストの減少部分の検出です。Haskell でリストを操作する際の重要なアイデアは、(まだ空のリストが手元にない場合) 常にリストの先頭末尾を見て、通常はそのリストを調べようとすることです。注文。

それでは、最初にリストが非厳密に減少しているかどうかを検出する関数を書きましょう。もちろん、これを行うにはいくつかの方法があります。追加のパラメーターなしで実行する再帰的アプローチを試してみましょう。あなたはすでに良いスタートを切った

dec :: [Int] -> Bool
dec [] = True

パターンマッチングを続けましょう。空でない次の最大のリストは、明らかに常に減少している 1 つの要素を持つリストです。

dec [x] = True

次のステップは興味深いです。2 つの要素 (xおよびy) が最初 (および場合によってはそれ以上) にあるリストがある場合、リストが減少するためには、明らかx >= yに保持する必要がありますが、 から始まる残りのリストもy減少する必要があります。それで十分なので、書き出すだけです

dec (x:y:rest) = x >= y && dec (y:res)

以上です!

次に、同じことを行うことができるエクササイズ機能について説明します。唯一の違いは、リストの増加に失敗すると、この時点からリストが減少する可能性があるかどうかを確認できることです。

ex :: [Int] -> Bool
ex [] = True
ex [x] = True
ex (x:y:rest) = (x <= y && ex (y:res)) || dec (x:y:rest)

どのようにしてそのコードを書くようになったのかについての説明が、次の演習に役立つことを願っています。また、これを解決するためのより効率的な方法が他にもたくさんあることに注意してください。

于 2013-10-06T20:51:29.773 に答える